【问题标题】:How to triple join tables to find and find entries that match two things?如何三重连接表以查找和查找匹配两件事的条目?
【发布时间】:2013-09-19 19:27:03
【问题描述】:

我有一个难以描述的简单问题(至少对我而言)。

考虑数据库建模课程的以下架构:

COURSE (cid, did, name, num, creditHours),

学生(sid、fname、lname、did)

ENROLLED_IN(eid、sid、cid)

什么查询可以找到参加 course.name=Math" 和 "Science" 的学生的 sid?

很抱歉,我问了一个类似(更简单)的问题,以为我可以弄清楚其余的问题,但我无法:https://stackoverflow.com/questions/18902489/how-to-find-entries-in-database-that-meet-multiple-matches

【问题讨论】:

  • 我最初误读了这个。您是否正在寻找那些同时学习数学和科学的学生的 sid?

标签: mysql sql database sqlite


【解决方案1】:

正如另一页所建议的,您需要对同一个表执行两次 JOIN。但由于您想使用名称而不是 cid,因此您需要根据注册数据加入 COURSE。

SELECT DISTINCT s.sid
FROM STUDENT s
INNER JOIN ENROLLED_IN e ON e.sid = s.sid
INNER JOIN COURSE c ON c.cid = e.cid AND c.Name = 'Math'
INNER JOIN COURSE c2 ON c2.cid = e.cid AND c2.Name = 'Science'

如果您需要完整的学生记录,那么...

SELECT STUDENT.*
FROM STUDENT
INNER JOIN
  (SELECT DISTINCT s.sid
   FROM STUDENT s
   INNER JOIN ENROLLED_IN e ON e.sid = s.sid
   INNER JOIN COURSE c ON c.cid = e.cid AND c.Name = 'Math'
   INNER JOIN COURSE c2 ON c2.cid = e.cid AND c2.Name = 'Science'
) t0 ON t0.sid = STUDENT.sid

EDIT 你也可以使用 GROUP BY 代替 DISTINCT,ala

   SELECT s.sid
   FROM STUDENT s
   INNER JOIN ENROLLED_IN e ON e.sid = s.sid
   INNER JOIN COURSE c ON c.cid = e.cid AND c.Name = 'Math'
   INNER JOIN COURSE c2 ON c2.cid = e.cid AND c2.Name = 'Science'
   GROUP BY s.sid

编辑而不是使用两个连接,您可以使用HAVING 子句

SELECT s.sid
FROM STUDENT s
INNER JOIN ENROLLED_IN e ON e.sid = s.sid
INNER JOIN COURSE c ON c.cid = e.cid
WHERE c.Name IN ('Math', 'Science')
GROUP BY s.sid
HAVING COUNT(*) = 2

【讨论】:

  • 嗯,这不起作用。添加最后一个科学连接后,它返回空白结果
  • 它说的列名不明确 'c.cid'
  • 是的,第二次加入应该是c2...我的错。我修复了我的帖子。但也请参阅我对 HAVING 子句的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 2013-04-07
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多