Mysql
 sql >> Database >  >> RDS >> Mysql

Come faccio a scrivere una semplice query di selezione invece di utilizzare le visualizzazioni?

Quello che ti serve è un HAVING clausola per trovare COUNT(*) = 2 dopo il raggruppamento per data e specialità. In effetti, non dovrebbe nemmeno essere necessaria la nidificazione. (Ho anche sostituito il tuo join implicito con FROM separato da virgole clausola con un esplicito JOIN , che è la sintassi moderna più preferita).

SELECT 
  v.pid,
  d.speciality,
  v.date,
  COUNT(COUNT DISTINCT d.did) AS numvisits
FROM 
  visits v
  JOIN Doctors d ON v.did = d.did
GROUP BY v.pid, d.speciality, v.date
HAVING COUNT(COUNT DISTINCT d.did) = 2
/* Note - depending on your RDBMS, you may
   be able to use the count alias as
HAVING numvisits = 2 
   MySQL allows this, for ex, but MS SQL Server doesn't and I think Oracle doesn't */

Il SELECT elenca qui e GROUP BY dovrebbe produrre l'ID del paziente, la specialità, la data e il numero di visite per la combinazione aggregata di queste 3 colonne. Il HAVING la clausola quindi lo limita solo a quelli con 2 visite per il gruppo.

Per tirare solo i pazienti da questo, avvolgilo in una sottoquery:

SELECT Patients.* 
FROM Patients JOIN (
  SELECT 
    v.pid,
    d.speciality,
    v.date,
    COUNT(COUNT DISTINCT d.did) AS numvisits
  FROM 
    visits v
    JOIN Doctors d ON v.did = d.did
  GROUP BY v.pid, d.speciality, v.date
  HAVING COUNT(COUNT DISTINCT d.did) = 2
) subq ON Patients.pid = subq.pid