Как выбрать n случайных строк в MySQL из подмножества большой таблицы? - PullRequest
1 голос
/ 08 июля 2010

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

Я читал, что вы можете просто выполнить ORDER BY RAND (), но это плохая идея для больших таблиц. Тем не менее, я могу ограничить количество строк максимум до 160 с помощью предложения WHERE. Таким образом, вопрос в том, оценивается ли и обрабатывается ли предложение WHERE перед ORDER BY RAND (), что делает это приемлемым решением?

Мой сценарий - я реализую карточную игру. У меня есть стол для колоды и стол для колоды. Я пытаюсь просто взять n случайных карт из таблицы deck_cards. Каждая игра имеет отдельную колоду, поэтому, когда игрок берет n карт, я знаю, что это из определенной колоды, поэтому предлагаемый запрос:

select id
from deck_cards
where deck_id = ? and draw_pile = true
order by rand()
limit 5

Столбец draw_pile для того, как он звучит, я отслеживаю, где находятся карты, в draw_pile или discard_pile.

Кстати, я делаю это в рельсах и пытаюсь перемешать результаты с Array.sort_by { rand }, но я вижу доказательства того, что рэнд рельсов не совсем случайный. Поэтому другой вопрос заключается в том, что лучше попробовать случайную функцию в SQL или в rails. В настоящее время у меня нет ни ORDER BY RAND, ни Limit в SQL. Я перетасовываю массив результатов в рельсы, а затем просто выталкиваю n карт из этого перемешанного массива. Но, опять же, я вижу результаты, которые указывают на то, что случайное перемешивание на самом деле не происходит случайным образом.

Другая проблема / решение - возможно, блокировка таблицы. Это многопользовательское приложение для игры в реальном времени. Иногда я вижу, что> 1 игрок тянет одну и ту же карту. Я предполагаю, что это происходит из-за того, что игроки рисуют одновременно и нажимают на этот запрос и перемешивают, которые каким-то образом возвращают перекрывающиеся результаты.

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

"Итак, вопрос в том, оценивается ли и обрабатывается ли предложение WHERE перед ORDER BY RAND (), что делает это приемлемым решением?"

Да.

Порядок по - это только курсор, который говорит, в каком порядке следует извлекать данные из набора.

0 голосов
/ 08 июля 2010

Я думаю, что использование подзапроса будет работать как WHERE, обработанный до ORDER BY

select id
from deck_cards
where id in (select id
             from deck_cards
             where deck_id = ? and draw_pile = true
          )
order by rand()
limit 5
...