首页 > 解决方案 > MySQL中的一个查询中的嵌套列表

问题描述

我正在构建一个教授-讲师-学生数据库,我正在努力获取正确的 MySQL 查询。

这是我的表:

Table PROFESSOR (id, name)
Table LECTURE (id, name, professorID, offeredThisYear) ... offeredThisYear is 1 or 0
Table STUDENT (id, name, inState) ... inState = 1 or 0 
Table LECTURE-STUDENT (lectureID, studentID)

我正在尝试编写的查询:

对于 PROFESSOR id = 1,我想要一份他/她今年教授的所有 LECTURE 的列表(offeredThisYear = 1)和一个注册该课程的仅在校学生(inState = 1)的列表。如果任何 LECTURE 没有 STUDENT,我希望它仍然被列出。


我的疑问:

SELECT * FROM lectures 
WHERE professorid = 2
AND offeredThisYear = 1
ORDER BY RAND()

退货

Lecture 15=Law
Lecture 7=Philosophy
Lecture 17=Mathematics
Lecture 13=German

现在,对于每堂课,我想要一个在校学生的名单,例如:

Lecture 15=Law (Joshua, Patricia)
Lecture 7=Philosophy (Patricia, Joshua, Mary, Joseph, Sandra)
Lecture 17=Mathematics (Jessica)
Lecture 13=German ()

***注:没有人学德语,但还是列在了因为教授2今年教德语

我不想像这样为每个讲座做一个单独的查询:

SELECT GROUP_CONCAT(DISTINCT p.name, ' ' ORDER BY RAND() SEPARATOR ', ') 
FROM students p, lectures_students q
WHERE q.lectureid = 17 
AND p.id = q.studentid
AND p.instate = 1

我怎样才能在一个查询中实现这个嵌套列表?

我确实在论坛的各个线程上查看了解决方案,但仍然无法理解如何为我的所有规范编写查询,尤其是“本课没有学生”的情况

非常感谢您的帮助。我是一名业余程序员,但这超出了我的能力范围。

标签: mysqlnested-loops

解决方案


感谢两位响应者。我已经结合起来得到正确的结果。此代码有效。

SELECT 
    l.id,
    l.name, 
    GROUP_CONCAT(s.name ORDER BY RAND() SEPARATOR ', ') 
FROM lectures l
LEFT JOIN lectures_students ls ON ls.lectureid = l.id
LEFT JOIN students s ON s.id = ls.studentId AND s.inState = 1
WHERE l.professorid = 2 AND l.offeredthisyear = 1
GROUP BY l.id, l.name
ORDER BY RAND()

推荐阅读