我有两个表:
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,那么我会丢弃结果并再次运行第一个查询。
我如何在一个查询中尝试执行此操作?
最佳答案
这已经过测试并且可以工作:
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 fiddle :http://sqlfiddle.com/#!2/e5b5b/1
关于php - 从数据库中选择随机三份(或更多),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17268193/