从数据库中选择随机三次(或更多)

时间:2013-06-24 04:47:44

标签: php mysqli

我有两张桌子:

 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   |
                 +----+------------+---------+-------+ 

我想从一个在三个以上科目中注册的随机学生中选择所有科目和成绩。 (DaveKate

学生JohnMimi甚至不会被考虑,因为他们没有参加三门科目。

我知道我可以通过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,那么我会丢弃结果并再次运行第一个查询。

我如何在一个查询中尝试这个?

1 个答案:

答案 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