我有两张桌子:
Students Student_Grades
V------------------------V
+----+------+ +----+------------+---------+-------+
| id | name | | id | student_id | subject | grade |
+----+------+ +----+------------+---------+-------+
| 0 | Dave | | 0 | 0 | Math | 100 |
+----+------+ +----+------------+---------+-------+
| 1 | John | | 1 | 0 | Chem | 90 |
+----+------+ +----+------------+---------+-------+
| 2 | Kate | | 2 | 0 | CompSCI | 95 |
+----+------+ +----+------------+---------+-------+
| 3 | Mimi | | 3 | 1 | ELA | 98 |
+----+------+ +----+------------+---------+-------+
| 4 | 2 | Biology | 92 |
+----+------------+---------+-------+
| 5 | 2 | Chem | 94 |
+----+------------+---------+-------+
| 6 | 2 | Math | 98 |
+----+------------+---------+-------+
| 7 | 3 | Math | 100 |
+----+------------+---------+-------+
我想从一个在三个以上科目中注册的随机学生中选择所有科目和成绩。 (Dave
或Kate
)
学生John
和Mimi
甚至不会被考虑,因为他们没有参加三门科目。
我知道我可以通过PHP实现这一点,但我希望这可以通过对数据库的一个查询来完成。
SELECT * FROM Students t JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Students) AS x ON t.ID >= x.ID LIMIT 1
通过上述查询,我选择了一名随机学生,我可以进入并检查他们是否有三个SELECT count(subjects) FROM Students WHERE id=random_id
科目。
如果返回的计数低于3,那么我会丢弃结果并再次运行第一个查询。
我如何在一个查询中尝试这个?
答案 0 :(得分:2)
这是经过测试和运作的:
SELECT *
FROM Students s
JOIN (
SELECT student_id
FROM Student_Grades
GROUP BY student_id
HAVING COUNT(*) >= 3
ORDER BY RAND()
LIMIT 1
) rs
ON rs.student_id = s.id
JOIN
Student_Grades sg
ON sg.student_id = s.id
这是SQL小提琴:http://sqlfiddle.com/#!2/e5b5b/1