Случайно получить несколько строк из таблицы

0

Сейчас я выбираю 3 случайные строки из таблицы, используя ORDER BY Rand();, как указано во всем Интернете, этот метод выполняется очень медленно. Я использую его в базе данных с 30 строками, и для возврата значения требуется много времени. Большинство других решений, которые я нашел, возвращают только одну строку. Какой лучший способ вернуть несколько случайных строк?

$get_projects_query = 
  mysql_query(
    "SELECT p_id FROM project_data WHERE p_featured='1' ORDER BY Rand() LIMIT 3"
  ) or die(mysql_error());

while($project_row = mysql_fetch_array($get_projects_query)) {?>
  //Do stuff
} 
//end three random featured projects loop)
  • 2
    @BandonRandon - Вы должны проверить, какая часть / метод медленный. order by rand() не будет работать медленно на таблице только с 30 строками.
  • 0
    Вы уверены, что на самом деле этот запрос занимает столько времени?
Показать ещё 4 комментария
Теги:
random

4 ответа

1
Лучший ответ

Если есть только 30 строк, у вас есть пара других опций.

Вариант № 1

  • выберите все 30 строк.
  • вызов shuffle()
  • прочитайте первые 3 с кучи

Вариант № 2

  • Сгенерируйте 3 случайных числа от 0 до 29. Назовите их r1, r2, r3.
  • SELECT... WHERE p_id IN (r1, r2, r3)

Вариант № 3

  • SELECT p_id FROM...
  • while ($ row = mysql_fetch_assoc ($ result)) $idList [] = $row [ "p_id" ];
  • перетасовка ($ список_идентификаторов)
  • SELECT... WHERE p_id IN ($ idList [0], $idList [1], $idList [2])
  • 1
    Вариант № 2 должен предполагать, что первичные ключи строки являются последовательными и без пробелов. Для такого небольшого количества строк вариант # 1 кажется очень разумным, даже сохраняя результаты в memcache или подобном.
  • 0
    Конечно. Но если есть только 30 строк, вы можете надеяться, что идентификаторы увеличиваются монотонно.
Показать ещё 2 комментария
1

Сначала выберите счетчик таблиц. Заказ по столбцу индекса (возможно, первичный ключ). Затем выберите предел 1 со смещением = в случайное целое число в диапазоне от 0 до счетчика таблицы.

  • 0
    Разве этот метод не вернет только один результат?
0

Если у вас есть только 30 строк, почему бы не загрузить все 30 строк вашему клиенту, а затем сгенерировать 3 случайных индекса строки

0

Как говорили все остальные. Имея только 30 элементов в вашем запросе, выполните следующие действия:

  • сделайте свой запрос без RAND()
  • построить массив/объект со всеми элементами - например: items []
  • сгенерировать 3 случайных числа (x1, x2, x3) между 1 и длиной массива, а затем отобразить их: элементы [1], пункты [2], пункты [3]

Или ваш запрос имеет только на момент 30 результатов, но со временем он будет больше и больше?

  • 0
    Прямо сейчас у меня есть только 5 запросов. Это для моего портфолио, так что я не вижу, чтобы оно стало больше 30, и это было бы много проектов, на которые можно было бы посмотреть. Я думал, 30 Макс.
  • 0
    Так что делай так. Все просто и работает точно :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню