Выберите последние строки, а затем рандомизируйте эти строки, а затем отобразите первые 2 из рандомизированных строк - PullRequest
0 голосов
/ 06 октября 2019

У меня есть таблица с именем 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 │ 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 строки. Моя конечная цель - получить последние записи о каждом ученике. Мне плевать на их прошлые записи. Я просто хочу их самые последние, а затем я хочу их рандомизировать. Какой самый эффективный способ сделать это?

1 Ответ

1 голос
/ 06 октября 2019

Этот запрос даст вам результаты, которые вы хотите. Он находит строку для каждого учащегося с максимальным значением 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;

Демонстрация на dbfiddle

...