Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: count nie liczy tak jakbym sobie tego życzył
Forum PHP.pl > Forum > Bazy danych > MySQL
sledziu1
Mam z poniższym zapytaniem:

  1. SELECT users.id, users.login, count( k.id ) AS liczba, count( k2.id ) AS pozytywne, count( k1.id ) AS neutralne, count( k0.id ) AS negatywne
  2. FROM users JOIN komentarze AS k ON k.TO = users.id
  3. LEFT JOIN komentarze AS k2 ON k2.TO = users.id AND k2.typ =2
  4. LEFT JOIN komentarze AS k1 ON k1.TO = users.id AND k1.typ =1
  5. LEFT JOIN komentarze AS k0 ON k0.TO = users.id AND k0.typ =0
  6. GROUP BY users.id
  7. ORDER BY liczba DESC LIMIT 0, 10


Problem polega na tym, że wyniki count nie są dla mnie satysfakcjonujące.

Wynik zapytania to:

A powinien:



Z góry dziękuje za wszelką pomoc.

Zrzut tabel:

  1. -- phpMyAdmin SQL Dump
  2. -- version 2.10.3
  3. -- Wersja serwera: 5.0.45
  4. -- Wersja PHP: 5.1.6
  5.  
  6. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  7.  
  8.  
  9. -- --------------------------------------------------------
  10.  
  11. --
  12. -- Struktura tabeli dla `komentarze`
  13. --
  14.  
  15. CREATE TABLE `komentarze` (
  16. `id` int(11) NOT NULL AUTO_INCREMENT,
  17. `from` int(11) NOT NULL,
  18. `to` int(11) NOT NULL,
  19. `aid` int(11) NOT NULL,
  20. `text` varchar(300) NOT NULL,
  21. `reply` varchar(300) DEFAULT NULL,
  22. `dodano` datetime NOT NULL,
  23. `typ` int(2) NOT NULL DEFAULT '2',
  24. `rejstr` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'czy właściciel zarejstrowany',
  25. PRIMARY KEY (`id`)
  26. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=88 ;
  27.  
  28. --
  29. -- Zrzut danych tabeli `komentarze`
  30. --
  31.  
  32. INSERT INTO `komentarze` VALUES (82, 11, 423, 0, 'asdas', NULL, '2008-03-02 17:51:56', 2, 1);
  33. INSERT INTO `komentarze` VALUES (83, 11, 423, 0, 'asdas', NULL, '2008-03-02 17:51:56', 2, 1);
  34. INSERT INTO `komentarze` VALUES (84, 11, 423, 0, 'asdas', NULL, '2008-03-02 17:51:56', 2, 1);
  35. INSERT INTO `komentarze` VALUES (87, 12, 423, 0, 'sssssssssssss', 'fddffsd', '2008-04-07 19:31:06', 1, 1);
  36.  
  37. -- --------------------------------------------------------
  38.  
  39. --
  40. -- Struktura tabeli dla `users`
  41. --
  42.  
  43. CREATE TABLE `users` (
  44. `id` int(11) NOT NULL AUTO_INCREMENT,
  45. `login` varchar(32) NOT NULL,
  46. `email` varchar(255) NOT NULL,
  47. `pass` char(40) NOT NULL COMMENT 'sha1',
  48. `active` varchar(8) NOT NULL COMMENT 'jeśli równe ''yes'' to user ma potwierdzone konto',
  49. `reg_date` datetime NOT NULL COMMENT 'data rejestracji',
  50. `ocen` int(11) NOT NULL DEFAULT '0' COMMENT 'liczba ocen (tymczasowe)',
  51. `imie` varchar(255) NOT NULL,
  52. `nazwisko` varchar(255) NOT NULL,
  53. `firma` varchar(255) NOT NULL,
  54. `adres` varchar(255) NOT NULL,
  55. `kod` varchar(6) NOT NULL DEFAULT '-',
  56. `miasto` varchar(255) NOT NULL,
  57. `woj` enum('','dolnośląskie','kujawsko-pomorskie','lubelskie','lubuskie','łódzkie','małopolskie','mazowieckie','opolskie','podkarpackie','podlaskie','pomorskie','śląskie','świętokrzyskie','warmińsko-mazurskie','wielkopolskie','zachodniopomorskie') NOT NULL,
  58. `nip` varchar(20) NOT NULL,
  59. `regon` varchar(20) NOT NULL,
  60. `tel1` int(10) NOT NULL,
  61. `tel2` int(10) NOT NULL,
  62. `gg` int(10) NOT NULL,
  63. `www` varchar(255) NOT NULL,
  64. `omnie` text NOT NULL,
  65. `photo` varchar(255) NOT NULL COMMENT 'nazwa zdj. z kat. /photos/',
  66. `dlug` int(11) NOT NULL DEFAULT '0',
  67. `lastseen` date NOT NULL,
  68. `firmach` char(1) NOT NULL DEFAULT '1',
  69. `adresch` char(1) NOT NULL DEFAULT '1',
  70. `kodch` char(1) NOT NULL DEFAULT '1',
  71. `miastoch` char(1) NOT NULL DEFAULT '1',
  72. `wojch` char(1) NOT NULL DEFAULT '1',
  73. `nipch` char(1) NOT NULL DEFAULT '1',
  74. `regonch` char(1) NOT NULL DEFAULT '1',
  75. `tel1ch` char(1) NOT NULL DEFAULT '1',
  76. `tel2ch` char(1) NOT NULL DEFAULT '1',
  77. `ggch` char(1) NOT NULL DEFAULT '1',
  78. `wwwch` char(1) NOT NULL DEFAULT '1',
  79. `imiech` char(1) NOT NULL DEFAULT '1',
  80. `nazwiskoch` char(1) NOT NULL DEFAULT '1',
  81. `block` varchar(4) DEFAULT NULL,
  82. PRIMARY KEY (`login`),
  83. KEY `id` (`id`),
  84. FULLTEXT KEY `login` (`login`)
  85. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=428 ;
  86.  
  87. --
  88. -- Zrzut danych tabeli `users`
  89. --
  90.  
  91. INSERT INTO `users` VALUES (423, 'sledziu1', '', '', 'yes', '2008-03-01 18:01:32', 0, 'aaa', 'bbb', 'fgggggg', 'zdsadas 22', '22-333', 'sdfsda', 'lubuskie', '', '', 1234, 6877, 0, '', 'fgfgfgddf<br />\r\n<b>aaa</b><br />\r\n<br />\r\n<br />\r\n<br />\r\nc', '', 0, '0000-00-00', '1', '1', '1', '1', '1', '', '', '1', '1', '', '', '', '', NULL);
JoShiMa
A wywal z zapytania county i wyświetl sobie jaką tabelę tworzysz za pomocą tych joinów.
nevt
  1. SELECT u.id, u.login, SUM(IFNULL(k.id, 0, 1)) AS liczba, SUM(IF(k.id=2, 1, 0)) AS pozytywne, SUM(IF(k.id=2, 1, 0)) AS neutralne, SUM(IF(k.id=0, 1, 0)) AS negatywne
  2. FROM users AS u LEFT JOIN komentarze AS k ON k.TO = u.id GROUP BY u.id ORDER BY liczba DESC LIMIT 10 ;
sledziu1
Kolega dał mi jeszcze takie rozwiazanie:
  1. SELECT users.id, users.login, count( DISTINCT(k.id) ) AS liczba, count( DISTINCT (k2.id )) AS pozytywne, count( DISTINCT (k1.id )) AS neutralne, count( DISTINCT (k0.id )) AS negatywne
  2. FROM users JOIN komentarze AS k ON k.TO = users.id
  3. LEFT JOIN komentarze AS k2 ON k2.TO = users.id AND k2.typ =2
  4. LEFT JOIN komentarze AS k1 ON k1.TO = users.id AND k1.typ =1
  5. LEFT JOIN komentarze AS k0 ON k0.TO = users.id AND k0.typ =0
  6. GROUP BY users.id
  7. ORDER BY liczba DESC LIMIT 0, 10


Sprawdzę zaraz odpowiedź nevt'a bo na oko będzie szybsza niz dołączanie 4 tabel.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.