关于mySQL的非常简单的查询(初学者问题)

时间:2010-07-18 20:34:42

标签: mysql database database-design greatest-n-per-group

对于SQL中的初学者,我有一个非常简单的问题。我在我的数据库中定义了3个表:“DOCTOR”,“PATIENTS”,“VISITS”。为了简单起见,我在这些表格中只有一对多关系:一位医生有很多病人,但病人只能看到一位医生,一位病人可以多次访问...在我的表中“访问”我有一个字段“时间戳”,知道最后一次访问的时间。

我想在MySQL上做一个“视图”,我会为每位医生提供最新的访问病人,而且只有最近的病人。假设每位医生每天看10名病人,我只想让每位医生看到最后一位拜访他的人。

我该怎么做这样的观点?

感谢您的帮助

编辑1

=>感谢您的回答!

我终于选择了一种更现实的方法,让“病人”看到很多“医生” 因此,我的表“VISITS”将如下所示:

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 个答案:

答案 0 :(得分:3)

我们使用Visits表通过按患者ID分组并选择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

编辑:我重新阅读了这个问题,这不会给你你想要的东西。因为它会列出重复的医生ID,显示所有患者的最新访问。

要获得每位医生的最新访问,

   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 :(得分:0)

这是一个SQL问题,如果你给出你的表模式,我们可以给你实际正确的sql

我愿意

选择Doctor,max(访问) 来自医生内部加入患者xxx内联合vistits yyy

这为您提供了医生和最后一次访问 - 加入此访问以获得耐心,完成工作

答案 2 :(得分:0)

以下是@ 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