2010-07-18 5 views
1

J'ai une question très simple pour un débutant en SQL. J'ai défini 3 tables dans ma base de données: "DOCTEUR", "PATIENTS", "VISITES". Pour des raisons de simplicité, je n'ai qu'une relation un-à-plusieurs entre ces tables: Un médecin a beaucoup de patients, mais un patient ne peut voir qu'un seul médecin et un patient peut faire beaucoup de visites ... dans mon tableau "VISITES" un champ "horodatage" pour savoir quand était la dernière visite.Requête très simple sur mySQL (question débutant)

Je veux faire une "vue" sur MySQL où j'aurai pour chaque médecin le dernier patient venu faire une visite, et seulement le plus récent. Disons que chaque médecin voit 10 patients par jour, je veux juste pour chaque médecin le dernier type qui lui a rendu visite.

Comment puis-je faire une telle vue?

Merci pour votre aide

EDIT 1

=> Merci pour vos réponses!

J'ai finalement opté pour une approche plus réaliste où un « patient » peut voir beaucoup de « docteur » Par conséquent, ma table « visits » ressemblera à ceci:

 
idVisit idDoctor idPatient timestamp 
1  1   1   2010-07-19 14:10 
2  1   2   2010-07-19 15:10 
3  2   1   2010-07-19 15:10 
4  3   1   2010-07-19 16:10 
5  2   2   2010-07-19 18:10 
6  2   3   2010-07-19 19:10 
7  1   1   2010-07-19 20:10 

Je puis 3 patients et 3 médecins. Par exemple, le patient 1 est allé deux fois voir le médecin 1, le médecin 2 fois et le médecin 3 fois.

Je voudrais construire ma demande de sorte que pour chaque (médecin, patient) j'ai la dernière visite. Cette requête devrait renvoyer les visites d'identification (2,3,4,5,6) et non 1 parce que la dernière visite que le patient a payée au docteur 1 était à 20:10 et pas à 14:10. Comment pourrais-je faire ça?

Encore une fois, j'apprécie vraiment vos commentaires et votre aide. Cela m'aide vraiment à améliorer mes conceptions lorsque je commence à utiliser SQL.

+0

Je suppose que nous pouvons supposer votre apparence de schéma comme suit: VISITS a (au moins) les colonnes doctorID, patientID et l'horodatage. – SwissCoder

+1

s'il vous plaît ne pas que vous devriez s'en tenir à une convention de dénomination pour les tables DB. utilisez singulier (ou pluriel si vous voulez vraiment, mais c'est moins recommandé). mais ne le mélange pas. Vous avez la table du médecin, donc c'est mieux de rester avec un patient et une table de visite – SwissCoder

+0

Merci, j'en tiendrai compte pour mes créations. Et vous avez raison pour les colonnes de la table de visite – am38

Répondre

0

c'est une question SQL, si vous donnez votre schéma de la table, nous pouvons vous donner la bonne sql

réelle que je ferais

sélectionnez Doctor, max (visite) de jointure interne médecin patients xxx jointure vistits sur yyy

cela vous donne l'un iste des médecins et dernière Vist - rejoindre ce à des visites pour obtenir le patient, l'emploi fait

3

Nous utilisons la table des visites pour trouver la dernière visite pour chaque patient, b y grouper par l'ID du patient et en sélectionnant le MAX (visitTime). Nous associons alors le patient à son médecin, via la table des patients.

SELECT doctorID, patientID, lastVisit FROM 
    Patients INNER JOIN (
     SELECT patientID, MAX(visitTime) AS lastVisit FROM Visits 
     GROUP by patientID) latestVisits 
    ON lastVisits.patentID = Patients.patentID 

EDIT: Je relis la question, et ce ne sera pas vous donner tout ce que vous voulez. Comme il va lister les ID de médecins en double, montrant la dernière visite pour tous les patients.

Pour obtenir la dernière visite pour chaque médecin,

SELECT doctorID, latestVisit, (SELECT p.doctorID, MAX(v.lastVisit) latestVisit 
    FROM Visits v INNER JOIN Patients p ON 
     v.patientID = p.patientID 
    GROUP BY p.doctorID) base INNER JOIN 
     (SELECT doctorID, patientID, lastVisit FROM 
     Visits v INNER JOIN Patients p ON 
      v.patientID = p.patientID) patientVisits ON 
     patientVisits.doctorID = base.doctorID AND patientVisits.lastVisit=base.lastVisit 

Étant donné que deux patients ne peuvent pas voir le même médecin en même temps, il n'y a pas de risque de plus d'une ligne étant retournée pour chaque médecin .

+1

Je voudrais juste modifier la requête un peu, à «GROUP BY doctorID» dans la sélection intérieure, qui est ce que je crois que le OP est à la recherche. – quantumSoup

+0

Merci beaucoup! Je vais essayer votre solution! – am38

0

est ici une version modifiée de la requête de @ MDMA qui fait ce que je pense que vous voulez:

SELECT doctorID, Patients.patientID, lastVisit FROM 
    Patients INNER JOIN (
     SELECT patientID, MAX(time) AS lastVisit FROM Visits 
     GROUP by doctorID) latestVisits 
    ON latestVisits.patientID = Patients.patientID 

Voici ce que je supposais votre schéma ressemble:

Doctors: doctorID 
Patients: patientID, doctorID 
Visits: doctorID, patientID, time