2010-07-18 5 views
1

У меня очень простой вопрос для новичка в SQL. Я определил 3 таблицы в моей базе данных: «ДОКТОР», «ПАЦИЕНТЫ», «ВИЗИТЫ». Для целей простоты у меня есть только соотношение «один-ко-многим» между этими таблицами: у одного врача много пациентов, но пациент может видеть только одного врача, а один пациент может много раз посещать ... в моем столе «ПОСЕЩЕНИЯ» У меня есть поле «метка времени», чтобы знать, когда был последний визит.Очень простой запрос на mySQL (вопрос начинающего)

Я хочу сделать «взгляд» на MySQL, где у меня будет для каждого врача последний пациент, который пришел в гости, и только последний. Скажем, каждый врач видит 10 пациентов в день, я просто хочу, чтобы у каждого врача был последний парень, который посетил его.

Как это сделать?

Спасибо за вашу помощь

EDIT 1

=> Спасибо за ваши ответы!

я, наконец, выбрал более реалистичный подход, когда «пациент» может увидеть много «доктора» Поэтому мой стол «ПОЕЗДКА» будет выглядеть следующим образом:

 
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 

У меня тогда 3 больных и 3 врачи. Например, пациент 1 пошел два раза, чтобы обратиться к врачу 1, однократному врачу 2 и одному врачу-времени 3.

Я хотел бы построить свою просьбу, чтобы для каждого (врач, пациент) у меня был последний визит. Этот запрос должен возвращать id Visits (2,3,4,5,6), а не 1, потому что последний визит, который пациент уплатил доктору 1, был в 20:10, а не 14:10. Как я мог это сделать?

Еще раз, я очень ценю ваши комментарии и вашу помощь. Это действительно помогает мне улучшить мои проекты, когда я начинаю использовать SQL.

+0

Я думаю, мы можем предположить, ваша схема выглядит например: VISITS имеет (по крайней мере) столбцы doctorID, patientID и временную метку. – SwissCoder

+1

, пожалуйста, не следует придерживаться соглашения об именах для таблиц db. использование единый (или множественное число если вы действительно хотите, но это менее рекомендуется). но не смешивать его. У вас есть стол для врача, поэтому лучше остановиться с пациентом и таблицей посещения. – SwissCoder

+0

Спасибо, учтите это для моих проектов. И вы правы для столбцов таблицы посещений. – am38

ответ

0

это SQL вопрос, если вы даете вашу схему таблицы мы можем дать вам реальный правильный SQL

Я бы сделать

выбери врач, макс (посещение) от врача внутреннего присоединиться к пациентам на хом внутреннее соединение vistits на их

это дает в IST врачей и последнего Вист - присоединиться к этим визитам, чтобы получить пациент, работа

3

Мы используем таблицу посещения найти последнюю поездку для каждого пациента, б y группируя идентификатор пациента и выбирая MAX (visitTime). Затем мы связываем пациента со своим врачом через таблицу пациентов.

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: Я перечитываю вопрос, и это не даст вам совершенно то, что вы хотите. Так как в нем будут перечислены дубликаты идентификаторов врачей, показывающие последний визит для всех пациентов.

Чтобы получить последнюю поездку для каждого врача,

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 

Учитывая, что у двух пациентов не могут видеть один и тот же врач в то же время, нет никакого риска более одной строки возвращается для каждого врача ,

+1

Я просто немного изменил бы запрос, «GROUP BY doctorID» во внутреннем выборе, что я считаю, что OP ищет. – quantumSoup

+0

Спасибо большое! Я попробую ваше решение! – am38

0

Вот модифицированная версия запроса @ МДМА, который делает то, что я думаю, что вы хотите:

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 

Вот что я предполагал, ваша схема выглядит следующим образом:

Doctors: doctorID 
Patients: patientID, doctorID 
Visits: doctorID, patientID, time 
Смежные вопросы