选择最新的行,然后将那些行随机化,然后显示随机行的前2个

问题描述 投票:0回答:1

我有一个名为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   │ 23    │ 2019-10-04 11:42:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 7  │ james │ 86    │ 2019-10-05 12:11:20 ║
╚════╧═══════╧═══════╧═════════════════════╝

首先,我想从表中选择所有名称,但我只希望它们的最新记录。例如。 James有2条记录。一个带有id 2,另一个带有id 7。因此,我想使用id 7,因为id较大。

我这样做是为了:

╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name  │ grade │ date_added          ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 5  │ mike  │ 83    │ 2019-10-04 09:28:43 ║
╟────┼───────┼───────┼─────────────────────╢
║ 6  │ bob   │ 23    │ 2019-10-04 11:42:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 7  │ james │ 86    │ 2019-10-05 12:11:20 ║
╚════╧═══════╧═══════╧═════════════════════╝

SELECT *
FROM student_grade 
GROUP BY id
ORDER BY id DESC

现在我想将那些行随机化,并获得那些随机行的前2行

╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name  │ grade │ date_added          ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 7  │ james │ 86    │ 2019-10-05 12:11:20 ║
╟────┼───────┼───────┼─────────────────────╢
║ 5  │ mike  │ 83    │ 2019-10-04 09:28:43 ║
╚════╧═══════╧═══════╧═════════════════════╝

我如何将这3行随机化。我的最终目标是获取每个学生的最新记录。我不在乎他们过去的记录。我只想要他们最近的那些,然后我想将它们随机化。我这样做最有效的方法是什么?

mysql sql database random greatest-n-per-group
1个回答
1
投票

此查询将为您提供所需的结果。它为每个具有最大id值的学生查找行,然后对所有这些行进行随机排序并选择2:

SELECT *
FROM student_grade s
WHERE id = (SELECT MAX(id)
            FROM student_grade
            WHERE name = s.name)
ORDER BY RAND()
LIMIT 2

取决于表的大小,将其实现为JOIN可能会更有效:

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;

Demo on dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.