sql - 有关 SQL 查询的帮助

标签 sql database many-to-many

在之前的帖子中,我正在做一个非常简单的数据库,其中包含 3 个表“医生”、“患者”和“访问”。我试图让它更现实,现在包括“医生”和“病人”之间的多对多关系。 “访问”是导致此 n-m 关系的表。我假设我的表具有以下简单结构:

doctor
- idDoctor
- name

patient
-idPatient
-name
-dob

visit
-idVisit
-idPatient
-idDoctor
-timestamp

我正在使用以下数据进行查询:

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, 7) 而不是 1,因为患者最后一次拜访医生 1 的时间是 20:10 而不是 14:10。我该怎么做?

非常感谢您的评论和帮助。当我开始使用 SQL 时,它确实帮助我改进了我的设计。

最佳答案

假设 id 是按时间顺序分配的,你可以“作弊”

SELECT MAX(idVisit) AS idVisit,  idDoctor,  idPatient 
FROM visit
group by idDoctor,  idPatient 

如果不能做出那个假设

SELECT v.idVisit,  v.idDoctor,  v.idPatient 
FROM visit v
WHERE NOT EXISTS
(
    SELECT * FROM visit v2
    WHERE v2.idDoctor = v.idDoctor
    AND v.idPatient = v2.idPatient
    AND v2.timestamp > V.timestamp
)

或者,如果您的 DBMS 支持,

WITH V AS
(
SELECT idVisit, idDoctor, idPatient,
row_number() over(partition by idDoctor,  idPatient order by timestamp desc) AS RN
FROM visit
)

SELECT idVisit, idDoctor, idPatient
FROM V 
WHERE RN=1

关于sql - 有关 SQL 查询的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3281854/

相关文章:

database - Laravel 4 多对多与 Eloquent 和复选框

sql - 如何比较 postgres 更新策略中一行的旧值和新值

sql - SQL Server 中的 COUNT(*) 是常数时间操作吗?如果没有,为什么不呢?

mysql - 建立 N-M 关系的问题

java - 我应该使用什么数据存储来在我的应用程序中存储歌词?

php - Doctrine 查询生成器未给出所有结果 : many-to-many searching id in (x, y)

sql - 财务期间的日期时间转换

MySQL 连接查询计数为每个结果返回一行

database - oracle中schema和service_name是什么关系?

c# - 如何使用 EF 在 MVC Code-first 中更新/创建多对多关系数据?