Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ograniczenie zapytania z 'count'
Jozjasz
post 23.08.2012, 14:31:45
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 11.09.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował Jozjasz 23.08.2012, 14:35:39
Go to the top of the page
+Quote Post
skowron-line
post 23.08.2012, 14:42:07
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


Musisz użyc klauzuli HAVING
  1. HAVING COUNT(...) > 2


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
pmir13
post 23.08.2012, 15:38:39
Post #3





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 03:31