Альтернатива использованию порядка по rand ()?

Используйте инструкцию update.

update issued_books set Book_4 = $IssuedBookNumber
where Student_ID = '$Student_ID'
0
задан Strawberry 2 March 2019 в 08:05
поделиться

1 ответ

Предположительно, вы не знаете, сколько строк будет возвращено, поэтому это необходимо вычислить.

Идея заключается в следующем:

  • Рассчитать количество возвращаемых строк.
  • Используйте rand() в предложении WHERE, чтобы свести множество к разумному числу.
  • Используйте order by rand() для окончательной случайности.

Это выглядит так:

select t.*
from (select t1.*, (@cnt := @cnt + 1) as seqnum,
             rand() as rnd
      from table1 t1 cross join
           (select @cnt := 0) params
      where not exists (select id 
                        from table2 
                        where id = table1.id
                       ) and
            prize_list_id = 100 and
            prize_group_id in (109, 111, 113, 119, 120, 127, 129) 
     ) t
where rnd < 2000 / @cnt
order by rnd
limit 1000

where следует выбрать где-то около 2000 строк, что является безопасным числом, чтобы убедиться, что у вас есть по крайней мере 1000 (на самом деле, вы можете использовать меньшее число, например 1200). order by находится в меньшем подмножестве и должен быть быстрее.

Я не думаю, что rand() является особенно дорогой функцией, но это предварительно вычисляет значение для каждой строки, поэтому она вызывается только один раз для каждой строки в подзапросе.

0
ответ дан Gordon Linoff 2 March 2019 в 08:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: