Выберите последние строки и ровно 2 строки с одним условием и 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   │ 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 │ 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 баллов. Я хочу, чтобы ровно 2 студентов от 70-80 (выбрано случайным образом) и точно 2 (выбрано случайно) от 90-99. Как я могу это сделать?

Ответы [ 2 ]

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

У меня вопрос, как я могу выбрать последние записи с 2 студентами, которые набрали от 70 до 80 баллов (выбраны случайным образом), и с двумя студентами, набравшими от 90 до 99 баллов (выбраны случайным образом).

В 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;
0 голосов
/ 06 октября 2019

Вы можете UNION ALL вместе два существующих запроса получить желаемые результаты:

(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)

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

Мы можем использовать UNION ALL поскольку мы знаем, что дубликатов не будет, потому что диапазоны оценок разные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...