Очень простой запрос на MySQL (вопрос для начинающих) - PullRequest
1 голос
/ 19 июля 2010

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

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

Как я могу сделать такое представление?

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

РЕДАКТИРОВАТЬ 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 посещений (2,3,4,5,6), а не 1, поскольку последний визит, который пациент нанес врачу 1, был в 20:10, а не в 14:10. Как я мог это сделать?

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

Ответы [ 3 ]

3 голосов
/ 19 июля 2010

Мы используем таблицу посещений, чтобы найти последнее посещение для каждого пациента, сгруппировав его по идентификатору пациента и выбрав 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

РЕДАКТИРОВАТЬ: Я перечитал вопрос, и это не даст вам совсем то, что вы хотите. Поскольку в нем будут указаны дубликаты идентификаторов врача, с указанием последнего визита для всех пациентов.

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

   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

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

0 голосов
/ 19 июля 2010

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

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
0 голосов
/ 19 июля 2010

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

Я бы сделал

выбор доктора, макс.на xxx посещение внутреннего соединения на yyy

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

...