Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ograniczenie zapytania z 'count'
Forum PHP.pl > Forum > Bazy danych > MySQL
Jozjasz
Witam,

Mam taką baze z dwóch tabel na których uczę się podstaw i złączeń
Patient: id, first_name, last_name
Exam: id, patient_id(klucz obcy), opis, date

Potrafię zrobić zapytanie, które wyliczy którzy pacjenci mają najwięcej badań:

  1. SELECT count(patient.id) AS 'ilosc badan', patient.id, first_name, last_name, opis FROM patient INNER JOIN exam ON patient.id=exam.patient_id GROUP BY patient.id ORDER BY 1 DESC;



... ale jak ograniczyć teraz wynik tylko do tych którzy mają więcej niż 2 badania?

Z góry dzięki
skowron-line
Musisz użyc klauzuli HAVING
  1. HAVING COUNT(...) > 2
pmir13
Skoro się uczysz, to warto byłoby od razu na początku uczyć się porządnych zapytań. W swoim pierwszym grupujesz po patient_id, czyli dla każdego pacjenta będziesz miał co najwyżej jeden rekord, jakiego więc wyniku oczekujesz w kolumnie opis? Przecież ten opis dotyczy jednego, konkretnego badania. Mysql w domyślnej konfiguracji taką składnię przyjmie, ale według standardu sql jest ona błędna. W tym przypadku first_name i last_name będą jeszcze poprawne, bo w kazdej grupie wszystkie są takie same, ale opis już będzie nieokreślony - mysql wypluje pierwszy z brzegu, który będzie miał pod ręką.
Proponuję poczytać: http://dev.mysql.com/doc/refman/5.5/en/gro...en-columns.html

Prawidłowe zapytanie powinno wyglądać tak:

  1. SELECT p.id, p.first_name, p.last_name, e.exam_count
  2. FROM patient AS p
  3. JOIN
  4. ( SELECT patient_id, COUNT(*) AS exam_count
  5. FROM exam
  6. GROUP BY patient_id
  7. HAVING exam_count > 2 ) AS e
  8. ON p.id = e.patient_id


Takie zapytanie jest nie tylko poprawne, ale też bardziej wydajne, przy założeniu indeksu na patient_id w tabeli exam, ale ogólnie zewnętrzne klucze do innych tabel zawsze powinny być indeksowane. Co prawda przy małej bazie różnicy nie będzie, ale warto wyrobić sobie dobre nawyki. Łączenie kilku tabel i grupowanie po całości musi być wolniejsze, na połączonych tabelach nie ma możliwości wykorzystania indeksów do pomocy w grupowaniu, indeksy działają tylko w obrębie danej tabeli.
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.