Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ilość osób, które mają wizytę w wybranym okresie czasu, ale więcej niż X ogólem
Forum PHP.pl > Forum > Bazy danych > MySQL
monikar
Hej, próbuje utworzyć zapytanie do bazy, które zwróci mi:
- ilość osób danego dnia, które:
- mają wizytę w wybranym okresie czasu i :
- będą to tylko te osoby, które ogółem mają więcej niż dwie wizyty

Mam dwie tabele: patient i visit. visit łączy się z patient po patientid. Przyjmujemy, że patient to pacjenci , a visit to wizyty tych pacjentów, co za tym idzie każdy pacjent może mieć X wizyt.
Mam problem z ograniczeniem tych dat. To co udało mi się do tej pory stworzyć (zapytanie nie zwraca żądanej wartości):

  1. SELECT DISTINCT(PatientID), Patient.firstname, patient.lastname, COUNT(DISTINCT(PatientID)), count(*),
  2. (SELECT count(*) FROM Visit v
  3. JOIN Patient p ON v.patientID = p.id
  4. WHERE v.x_removetime IS NULL
  5. AND p.ID = Patient.Id
  6. ) AS a
  7. FROM Patient
  8. JOIN Visit ON Visit.patientID = patient.id
  9. WHERE Visit.X_RemoveTime IS NULL
  10. AND Visit.StartTime BETWEEN '2022-03-01' AND '2022-03-30'
  11. GROUP BY Patient.id
  12. HAVING count(*) > 2


Proszę o wskazówki lub jakąś inną pomoc smile.gif
nospor
Przekombinowane i masa literowek

  1. SELECT p.id, p.firstname, p.lastname, count(p.id) FROM Patient p
  2. LEFT JOIN Visit v ON v.patientID = p.id
  3. WHERE v.X_RemoveTime IS NULL
  4. AND v.StartTime BETWEEN '2022-03-01' AND '2022-03-30'
  5. GROUP BY p.id
  6. HAVING count(p.id) > 2
monikar
Niestety, ale zaproponowałeś rozwiązanie które zwraca pacjentów, którzy w wybranym zakresie czasu mają więcej niż jedną wizytę, a nie takie jest założenie.

Muszę końcowo otrzymać jedną liczbę.

Chodzi mi o to, że np mamy dwóch pacjentów:

Anetek Bela, który ma wizyty:
-2022-02-13
-2022-02-28
-2022-03-23

Szymon Majewski, który ma wizyty:
-2022-01-02
-2022-03-01
-2022-03-22

Querka powinna zwrócić mi liczbę 1, bo tylko jeden pacjent spełnia warunki:

-ma wizytę w dniu 2022-03-23
-ogólnie ma więcej niż jedną wizytę

Zakładając OFC taki zakres dat:
  1. SELECT DISTINCT(PatientID), Patient.firstname, patient.lastname, COUNT(DISTINCT(PatientID)), count(*),
  2. (SELECT count(*) FROM Visit v
  3. JOIN Patient p ON v.patientID = p.id
  4. WHERE v.x_removetime IS NULL
  5. AND p.ID = Patient.Id
  6. ) AS a
  7. FROM Patient
  8. JOIN Visit ON Visit.patientID = patient.id
  9. WHERE Visit.X_RemoveTime IS NULL
  10. AND Visit.StartTime BETWEEN '2022-03-23 00:00:00' AND '2022-03-23 23:59:59'
  11. GROUP BY Patient.id
  12. HAVING count(*) > 2


Przy takim zapytaniu obecnie zwraca mi liczbę 0. Nie zwracaj uwagi na razie na to co jest w select (kolumny) - testowo sobie tak wprowadzam aby weryfikować poprawność danych pacjentów.
nospor
No tak, nie doczytalem

  1. SELECT p.id, p.firstname, p.lastname, count(p.id) FROM Patient p
  2. LEFT JOIN Visit v ON v.patientID = p.id
  3. WHERE
  4. p.id IN (SELECT patiendID FROM Visit GROUP BY patientID HAVING count(patientID) > 2)
  5. AND
  6.  
  7. v.X_RemoveTime IS NULL
  8. AND v.StartTime BETWEEN '2022-03-01' AND '2022-03-30'
  9. GROUP BY p.id
monikar
Chyba działa poprawnie, dzięki śliczne za pomoc smile.gif
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-2024 Invision Power Services, Inc.