mysql - 如何三重连接表以查找和查找匹配两个事物的条目?

标签 mysql sql database sqlite

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

考虑数据库建模类(class)的以下模式:

类(class) (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

最佳答案

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

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

   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

关于mysql - 如何三重连接表以查找和查找匹配两个事物的条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18903279/

相关文章:

php - Laravel 播种我的表(多对多关系)失败

php - 使用 PHP、Ajax 和 Jquery 更改密码

database - 存储文件的最佳方式

java - 如何将结果保存到Excel文件或csv文件?

python - 数百万对的 Redis/Dictionaries/sqlite3

MySQL:内存不足/MariaDB

java - 当数据库 Mysql 崩溃时,我如何知道在 java 中

MySQL 嵌套 SELECT

sql - 用同一张表中的另一个值更新列?

sql - SQL Server中的可选参数