MYSQL выбор строк-кандидатов случайным образом, но только один раз - PullRequest
1 голос
/ 13 апреля 2020

В моей базе данных есть таблица с 3 столбцами: id, name, category_id, в которой 1 миллион строк. пользователь выбирает category_id в приложении, а затем база данных должна вернуть 12 строк, которые имеют выбранный category_id. затем в следующем вызове API, база данных должна вернуть следующие 12 строк, которые имеют выбранный category_id и т. д.

Мой вопрос заключается в том, как я могу возвращать строки случайным образом и избежать возврата повторяющихся строк в следующий API звонит ?

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Предполагая, что id является ключом таблицы и имеет только положительные значения, вы можете сделать:

select id, name, category_id
from my_table
where category_id = ? and id > ?
order by id
limit 12

При первом вызове вы можете использовать:

  • category_id = 123
  • id = -1

Во второй раз вы получаете максимум id из ранее (скажем, 25) и используете тот .

  • category_id = 123
  • id = 25
1 голос
/ 13 апреля 2020

Вы ищете повторяемую случайную сортировку. Для этого вы можете использовать RAND() с семенем. Идея заключается в том, что каждому поиску должен быть присвоен постоянный начальный уровень (например, который вы можете сохранить в сеансе пользователя).

Предполагая, что у пользователя есть начальное значение 12345, вы можете извлечь его первую страницу, например:

select * from mytable where category_id = ? order by rand(12345) limit 12

Затем вторая страница извлекается следующим образом:

select * from mytable where category_id = ? order by rand(12345) limit 12, 12

Третья страница:

select * from mytable where category_id = ? order by rand(12345) limit 24, 12

И т. Д.

...