Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: COUNT, GROUP BY i HAVING w jednym - jak ?
Forum PHP.pl > Forum > Bazy danych > MySQL
legorek
Witam!

[MIAŁO BYĆ W MYSQL, jesli mozna proszę o przeniesienie - mój błąd]

Mam ciężki orzech do zgryzienia

Mam tabele, która w uproszczeniu wygląda tak:

Kod
]id | id_usera | nick_usera | oceny_plus | oceny_minus
1       12            ala               5          12
2       12            ala               4          7
3       99            tomek             3          0
4       13            ola               11         0


I takie zapytanie:

  1. SELECT `nick_usera`, SUM(`oceny_plus`) AS plusy, SUM(`oceny_minus`) AS minusy, (SUM(`oceny_plus`)/(SUM(`oceny_plus`)+SUM(`oceny_minus`))*100) AS procenty
  2. FROM forum_posty GROUP BY `id_usera` HAVING (plusy+minusy >= 10) ORDER BY procenty DESC, plusy DESC"


Które działa bez problemu, zwraca listę nicków i te informacje o które pytam. Teraz chciałbym przerobić to zapytanie, żeby zamiast informacji, zwracało liczbę wierszy, ale nie mam pojęcia jak wcisnąć COUNT. Kombinowałem ale zwraca mi wartośc z kosmosu.

Mój mysql to 4.0.cośtam
nospor
Cytat
[MIAŁO BYĆ W MYSQL, jesli mozna proszę o przeniesienie - mój błąd]
Przenosze. A nastepnym razem uzyj opcji raportuj.

Co do pytania:
  1. SELECT count(*)
  2. FROM forum_posty GROUP BY `id_usera` HAVING (plusy+minusy >= 10) ORDER BY procenty DESC, plusy DESC
legorek
Cytat(nospor @ 2005-12-10 20:21:55)
Cytat
[MIAŁO BYĆ W MYSQL, jesli mozna proszę o przeniesienie - mój błąd]
Przenosze. A nastepnym razem uzyj opcji raportuj.

OK, zapamiętam.
A co do Twojego zapytania, to juz próbowałem, to już go próbowałem, w swojej wersji czyli:

  1. SELECT count(*)
  2. FROM forum_posty GROUP BY `id_usera` HAVING (SUM(`oceny_plus`)+SUM(`oceny_minus`) >= 10)
, ale zwraca wynik z kosmosu, bo prawidłowo powinno być 46 a zwraca 81. Mogę podać link do strony z danymi na PM, wolałbym nie publicznie.
nospor
count zwraca ci liczbe rekordow, ktore spelniaja warunki. Skoro twoje zapytanie zwracalo ci wczesniej wlasciwe rekordy to count zwraca tylko ich liczbe. Tak wiec chyba rekordy co wczesniej otrzymywales nie byly jednak takimi co chciales.

Co do PW i analizy danych to za bardzo nie mam czasu.
SongoQ
Pytanie tylko jakiego COUNT chesz wyciagnac. Ile userwoz zwrocilo, czy ile kazdy user ma rekordow. Bo z pytania trudno sie domyslic.
legorek
No własnie troszkę źle napisałem, chce wiedzieć ile userów zwróciło. Zła liczba brało się stąd że

  1. SELECT count(`id_usera`)
  2. FROM forum_posty GROUP BY `id_usera` HAVING (SUM(`oceny_plus`)+SUM(`oceny_minus`) >= 10)


zwraca wiele rekordów, a ja myślałem że zwraca tylko 1. I to wiele jest wartością którą szukam. Powiem inaczej potrzebuje

  1. SELECT count(count(`id_usera`))
  2. FROM forum_posty GROUP BY `id_usera` HAVING (SUM(`oceny_plus`)+SUM(`oceny_minus`) >= 10)
, ale takie coś oczywiście nie działa.
SongoQ
No to inaczej jak podzapytanie chyba nie zrobisz

  1. SELECT COUNT(*)
  2. FROM ( SELECT count(`id_usera`)
  3. FROM forum_posty GROUP BY `id_usera` HAVING (SUM(`oceny_plus`)+SUM(`oceny_minus`) >= 10)
  4. )
legorek
Problemem jest to, że nie mam mysql 4.1, więc po prostu zrobiłem potem num_rows, ale jest to rozwiązanie troche okrężne.
SongoQ
Moze to Cie zainteresuje SQL_CALC_FOUND_ROWS przyklad jest w manualu:)
legorek
Zainteresowało, ba nawet rozwiązało mój problem. Bardzo przydatne, szczególnie, przy stronicowaniu.
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.