Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment écrire une simple requête de sélection au lieu d'utiliser des vues ?

Ce dont vous avez besoin, c'est d'un HAVING clause pour trouver COUNT(*) = 2 après regroupement par date et spécialité. En fait, aucune imbrication ne devrait même être nécessaire. (J'ai également remplacé votre jointure implicite par des virgules séparées FROM clause avec un JOIN explicite , qui est la syntaxe moderne préférée).

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 */

Le SELECT list ici et GROUP BY doit produire l'identifiant du patient, la spécialité, la date et le nombre de visites pour la combinaison agrégée de ces 3 colonnes. Le HAVING clause le limite alors uniquement à ceux ayant 2 visites pour le groupe.

Pour tirer uniquement les patients de ceci, enveloppez-le dans une sous-requête :

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