Mysql 如何三重联接表以查找和查找匹配两个内容的条目?

Mysql 如何三重联接表以查找和查找匹配两个内容的条目?,mysql,sql,database,sqlite,Mysql,Sql,Database,Sqlite,我有一个很难描述的简单问题(至少对我来说) 对于数据库建模课程,请考虑以下模式: 课程(cid、did、姓名、数字、学分小时) 学生(sid、fname、lname、did) 已注册(eid、sid、cid) 什么查询可以找到注册课程的学生的sid。name=Math”和“Science”? 很抱歉,我问了一个类似(更简单)的问题,认为我可以解决其余的问题,但我无法解决:正如另一页所建议的,您需要对同一个表进行两次联接。但是,由于您希望使用名称而不是cid,因此您可以根据注册数据加入课程 SEL

我有一个很难描述的简单问题(至少对我来说)

对于数据库建模课程,请考虑以下模式:

课程(cid、did、姓名、数字、学分小时)

学生(sid、fname、lname、did)

已注册(eid、sid、cid)

什么查询可以找到注册课程的学生的sid。name=Math”和“Science”?


很抱歉,我问了一个类似(更简单)的问题,认为我可以解决其余的问题,但我无法解决:

正如另一页所建议的,您需要对同一个表进行两次联接。但是,由于您希望使用名称而不是cid,因此您可以根据注册数据加入课程

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
编辑而不是区分您也可以使用分组方式,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

我一开始误读了。你是在寻找那些同时注册数学和科学的学生的sid吗?嗯,这不起作用。在你为科学添加最后一个连接后,它返回空白结果,列名“c.cid”是的,第二个连接应该是
c2
…我的错。我修复了我的帖子。但也看到了我对的编辑有子句的。