我有一个名为student_grades
的表
╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name │ grade │ date_added ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 1 │ bob │ 23 │ 2019-10-01 14:25:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 2 │ james │ 45 │ 2019-10-02 17:31:27 ║
╟────┼───────┼───────┼─────────────────────╢
║ 3 │ mike │ 42 │ 2019-10-03 18:08:13 ║
╟────┼───────┼───────┼─────────────────────╢
║ 4 │ bob │ 68 │ 2019-10-04 02:00:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 5 │ mike │ 83 │ 2019-10-04 09:28:43 ║
╟────┼───────┼───────┼─────────────────────╢
║ 6 │ bob │ 93 │ 2019-10-04 11:42:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 7 │ james │ 98 │ 2019-10-05 14:51:20 ║
╟────┼───────┼───────┼─────────────────────╢
║ 8 │ steph │ 72 │ 2019-10-05 15:31:20 ║
╟────┼───────┼───────┼─────────────────────╢
║ 9 │ john │ 78 │ 2019-10-05 16:33:20 ║
╟────┼───────┼───────┼─────────────────────╢
║ 10 │ john │ 74 │ 2019-10-05 17:42:23 ║
╟────┼───────┼───────┼─────────────────────╢
║ 10 │ nick │ 92 │ 2019-10-05 17:59:12 ║
╚════╧═══════╧═══════╧═════════════════════╝
我使用此语句来获取学生的最新记录。例如。 James
有2条记录。一个带有id 2
,另一个带有id 7
。因此,我想使用id 7
,因为id较大。
然后我将那些行随机化,然后返回我
╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name │ grade │ date_added ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 7 │ james │ 86 │ 2019-10-05 12:11:20 ║
╟────┼───────┼───────┼─────────────────────╢
║ 5 │ mike │ 83 │ 2019-10-04 09:28:43 ║
╚════╧═══════╧═══════╧═════════════════════╝
声明:
SELECT s1.*
FROM student_grade s1
JOIN (SELECT name, MAX(id) AS id
FROM student_grade
GROUP BY name) s2 ON s2.name = s1.name AND s2.id = s1.id
ORDER BY RAND()
LIMIT 2;
[[我的问题是,我如何选择2名得分在70到80之间的学生(随机选择)和2名得分在90到99之间的学生(随机选择)的最新记录。
SELECT s1.*
FROM student_grade s1
JOIN (SELECT name, MAX(id) AS id
FROM student_grade
WHERE (grade >= 70 and grade <= 80) or (grade >= 90 and grade <= 99)
GROUP BY name) s2 ON s2.name = s1.name AND s2.id = s1.id
ORDER BY RAND()
LIMIT 4;
但是如果我做上述陈述,它[[可能给我3名得分为70-80的学生和1名得分为90-99的学生。我想从70-80(随机选择)中的
精确2个学生中,从90-99(随机选择)中的精确2个学生中。我该怎么办?
(SELECT s1.*
FROM student_grade s1
JOIN (SELECT name, MAX(id) AS id
FROM student_grade
WHERE grade BETWEEN 70 AND 80
GROUP BY name) s2 ON s2.name = s1.name AND s2.id = s1.id
ORDER BY RAND()
LIMIT 2)
UNION ALL
(SELECT s1.*
FROM student_grade s1
JOIN (SELECT name, MAX(id) AS id
FROM student_grade
WHERE grade BETWEEN 90 AND 99
GROUP BY name) s2 ON s2.name = s1.name AND s2.id = s1.id
ORDER BY RAND()
LIMIT 2)
我们可以使用UNION ALL
,因为我们知道不会重复,因为成绩范围不同。
在MySQL 8+中,最简单的方法使用行号:
select sg.* from (select sg.* row_number() over (partition by (case when grade between 70 and 80 then 1 when grade between 90 and 99 then 2 else 3 end) order by rand() ) as seqnum from student_grades sg where grade between 70 and 80 or grade between 90 and 99 ) sg where seqnum <= 2;