2013-11-30 4 views
1

Мне нужно выбрать 3 уникальных случайных строки идентификатора MySQL из таблицы, которая постепенно растет и растет с течением времени, и имеет WHERE 'status' = 'available'. Таким образом, он выбирает только номер id, если status = доступен.MySQL select 3 UNIQUE random ID rows fast WHERE

Не будет пробелов, так как все данные сохраняются для соблюдения соблюдения записей, если данные удаляются пользователем, он фактически не удаляется, только СТАТУС помечен как «удаленный».

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

Спасибо

:)

Я смотрел на делать что-то вроде этого (взято отсюда ... MySQL select 10 random rows from 600K rows fast)

SELECT id 
    FROM table AS r1 JOIN 
     (SELECT (RAND() * 
        (SELECT MAX(id) 
         FROM table)) AS id2) 
     AS r2 
WHERE r1.id >= r2.id2 AND status = 'available' 
ORDER BY r1.id ASC 
LIMIT 1 

Что дает мне то, что мне нужно, но это только возвращает 1 случайный уникальный «выбор», плюс ЕСЛИ Я его ограничиваю до 3, он не всегда выбирает 3, и если он выбирает 3, они всегда кажутся последовательными, что не случайно!

Есть ли способ повторить запрос, сохранить выбранный идентификатор и продолжить цикл/выполнение запроса до тех пор, пока не будут выбраны 3 ID. В RANDOM, которые являются разными. Это мой вопрос :)

+0

Это может быть быстро, но оно имеет тенденцию «предпочитать» записи после удаления. –

ответ

2

ли вы попробовать:

SELECT * 
FROM mytable 
WHERE status = 'available' 
ORDER BY RAND() 
LIMIT 0,3; 
+0

просто добавьте следующие условия: 'WHERE status = 'available'' – Kobi

+0

Это то, что осталось от моего ответа (удалено, я не мог понять)« Мне нужен быстрый ответ, извините, что мой пост не объяснил правильно, со временем может имеют много 100 тысяч строк, и не всегда «limit 3» вернет 3, иногда только возврат 1 или 2 - « –

+0

Это делает полное сканирование таблицы, поэтому не« быстрое ». –

0
SELECT DISTINCT * 
FROM table 
WHERE status = 'available' 
ORDER BY RAND() 
LIMIT 3 

отчетливое положение препятствует повторяющиеся значения. ORDER BY RAND() будет произвольно организовывать результат.

+0

хороший, я забыл о различите, но будет ли это FAST на столе, который содержит 1 миллион + строк? – user3052268

+0

Ну, вы не выберете миллион строк для отображения на странице, вы бы создали титры, не так ли? И если вы создаете запрос для статистики или ранжирования, вы должны обрабатывать данные и хранить их где-то в другом месте. Это может занять время, но это будет сделано только один раз в день или час (как пример). В любом случае, как только вы достигнете миллионов строк, большинство операций должно занять некоторое время. –

+0

Это делает полное сканирование таблицы, поэтому не «быстрое». –

0

См. Следующее; где он говорит о «пробелах», то есть эквивалент (статус = удалено) http://mysql.rjweb.org/doc.php/random#case_auto_increment_with_gaps_1_or_more_rows_returned (и осмотреться в этой ссылке для вариантов)

  • Требования: AUTO_INCREMENT, возможно, с зазорами из-за удаления и т.д.
  • Недостаток: только полуслучайные (ряды не имеют равных шансов на выбор), но частично компенсируют пробелы
  • Ошибка: первые и последние несколько строк таблицы с меньшей вероятностью будут доставлены.

Это получает 50 "последовательных" идентификаторов (возможно, с зазорами), а затем доставит случайные 10 из них.

-- First select is one-time: 
SELECT @min := MIN(id), 
     @max := MAX(id) 
    FROM RandTest; 
SELECT a.* 
    FROM RandTest a 
    JOIN (SELECT id FROM 
      (SELECT id 
       FROM (SELECT @min + (@max - @min + 1 - 50) * 
         RAND() AS start FROM DUAL) AS init 
       JOIN RandTest y 
       WHERE y.id > init.start 
       ORDER BY y.id 
       LIMIT 50   -- Inflated to deal with gaps 
      ) z ORDER BY RAND() 
      LIMIT 10    -- number of rows desired 
     ) r ON a.id = r.id; 

Да, это сложно, но да, это быстро, с учетом размера стола.

Смежные вопросы