MySQL рандомизированный список с последовательностью в списке - PullRequest
1 голос
/ 02 апреля 2020

У меня есть таблица студентов (идентификатор, имя, проект). Я хотел бы получить последовательную последовательность студентов, чьи проекты - «% science%».

SELECT NAME, id FROM students WHERE project LIKE '%science%' ORDER BY RAND()

Вот сложность: я хотел бы получить «порядковый номер» каждого студента в рандомизированный список. Это то, что у меня есть, и оно не работает.

SET @sequence=0;
SELECT @sequence:=@sequence+1 AS sequence, name, id
  FROM students
  WHERE project LIKE '%science%'
  ORDER BY RAND();
SELECT @sequence;

Может кто-нибудь помочь исправить это?

Run1:

1   486 Linda
2   307 Patricia
3   218 Barbara
4   713 Mary

Run2:

1   713 Mary
2   486 Linda
3   307 Patricia
4   218 Barbara

Благодарность, Джоанна

1 Ответ

0 голосов
/ 02 апреля 2020

MySQL пользовательские переменные и order by хитры. Документация гласит: :

HAVING, GROUP BY и ORDER BY, когда ссылка на переменную, которой назначено значение в списке выражений выбора, не работает должным образом, поскольку выражение вычисляется на клиенте и, следовательно, может использовать устаревшие значения столбца из предыдущей строки.

Безопаснее order by в подзапросе, затем назначить переменную:

SET @sequence=0;
SELECT @sequence:=@sequence+1 sequence, s.*
FROM (
    SELECT name, id 
    FROM students 
    WHERE project LIKE '%science%' 
    ORDER BY RAND()
) s;

Демонстрация на DB Fiddle :

Прогон 1:

sequence | name     |  id
-------: | :------- | --:
       1 | Linda    | 486
       2 | Patricia | 307
       3 | Mary     | 713
       4 | Barbara  | 218

Прогон 2:

sequence | name     |  id
-------: | :------- | --:
       1 | Barbara  | 218
       2 | Patricia | 307
       3 | Mary     | 713
       4 | Linda    | 486

Обратите внимание, что если вы используете MySQL 8.0, это намного проще (и эффективнее) сделать с помощью оконных функций:

    SELECT name, id, row_number() over(order by rand()) sequence
    FROM students 
    WHERE project LIKE '%science%' 
    ORDER BY sequence
...