MySQL中一个查询中的嵌套列表

MySQL中一个查询中的嵌套列表,mysql,nested-loops,Mysql,Nested Loops,我正在构建一个professor-Teachs-student数据库,我正在努力为其获取正确的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-STUDE

我正在构建一个professor-Teachs-student数据库,我正在努力为其获取正确的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)
  • 今年会有一些讲座,有没有
  • 有些学生不稳定,有些学生不稳定

我正在尝试编写的查询:

对于id=1的教授,我想要一份他/她今年教授的所有课程(offeredThisYear=1)的列表,以及一份只注册该课程的instate学生(instate=1)的列表。如果任何讲座没有学生,我希望它仍然被列出


我的问题是:

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

Lecture 15=Law
Lecture 7=Philosophy
Lecture 17=Mathematics
Lecture 13=German
现在,对于每节课,我想要一份instate学生名单,如:

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
如何在一个查询中实现这个嵌套列表

我确实在论坛中查看了各种线程上的解决方案,但仍然无法理解如何为我的所有规范编写查询,尤其是“该类没有学生”条件


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

我认为您需要
左键加入
和聚合。您可以从
讲座
开始加入,然后遵循与
讲座学生
的关系,然后是
学生
'inState'
上的过滤器必须放置在
左连接的
on
子句中。然后,您可以按课程进行汇总,并列出参加每个课程的所有学生的姓名

select 
    l.id,
    l.name, 
    group_concat(s.name order by s.id) student_names
from lectures l
left join lecture_student ls on ls.professorId = l.professorId
left join student s on s.id = ls.studentId and s.inState = 1
where l.professorid = 2 and l.offeredthisyear = 1
group by l.id, l.name

我认为您还没有完全确定实际的表名是什么(即,您的表名不一致),因此如果我没有完全正确的表名,您必须原谅我

以下SQL使用当前接受的JOIN synax:

SELECT l.name, GROUP_CONCAT(p.name ORDER BY s.name ASC SEPARATOR ', ') 
FROM LECTURE l LEFT JOIN LECTURE_STUDENT ls on l.id = ls.professorID
LEFT JOIN STUDENT s ON ls.studentID = s.id
WHERE s.inState = 1
GROUP BY l.name
注意:我使用了
l
s
ls
作为表的alises,更符合逻辑


我在
讲座上使用左连接,学生
学生
,以防没有学生报名参加某个讲座。

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

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

罗纳德,谢谢你。很抱歉,我把变量/表名弄糊涂了。请看下面我的回答。我在看你在标题下的SQL,我不想对每节课做这样的单独查询:你没有
的地方,l.professorid=2和l.OfferedThisear=1,这就是为什么我没有在我的SQL中包含这些条件。真的不清楚你对什么条件感兴趣。我认为你的问题的实质是连接。这与我的答案完全相同,除了order by rand()。。。无论如何,我只能建议你从上面的答案中选择一个并接受它,而不是发布你自己的答案。有关如何继续的信息,请参阅。