mysql - 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
我怎样才能在一个查询中实现这个嵌套列表?
我确实在论坛的各个线程上查看了解决方案,但仍然无法理解如何为我的所有规范编写查询,尤其是“本课没有学生”的情况
非常感谢您的帮助。我是一名业余程序员,但这超出了我的能力范围。
解决方案
感谢两位响应者。我已经结合起来得到正确的结果。此代码有效。
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()
推荐阅读
- javascript - 如何使用 jQuery 在多选下拉列表中设置值?
- python - 彭博 API 安装
- cluster-analysis - BIRCH 聚类后 Cluster Size 太大
- angular - 无法使用 Angular cli 在 Angular 中注册服务人员
- angular - 如何使用@agm-core 在角度谷歌地图上绘制多边形?
- sql - SQL TO MDX 转换(SUM 和大小写)
- python-3.x - 如何从 gensim 模块导入 WordEmbeddingSimilarityIndex 函数?
- python - 尝试在 AWS 中作为 lambda 函数运行时代码超时
- javascript - Javascript从后面的c#代码中读取公共变量
- c++ - 我可以在 CUDA 设备上为包含浮点数数组的对象分配内存吗?