2010-12-02 3 views
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 строками. – ajreal 2010-12-02 07:37:18

+0

Вы уверены, что на самом деле этот запрос длится так долго? – Gumbo 2010-12-02 07:39:00

+0

@ajreal, мне интересно, медленный ли мой сервер или факт загрузки изображений. humm ..... – BandonRandon 2010-12-02 07:40:49

ответ

1

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

Вариант № 1

  1. выборки всех 30 строк.
  2. вызов перетасовка()
  3. прочитал первые 3 от кучи

Вариант # 2

  1. Сформировать 3 случайных чисел от 0 до 29. Назовите их r1, r2, r3.
  2. SELECT ... ГДЕ P_ID В (r1, r2, r3)

Вариант № 3

  1. ВЫБОР P_ID ОТ ...
  2. в то время как ($ строка = mysql_fetch_assoc ($ результат)) $ idList [] = $ row ["p_id"];
  3. перетасовка ($ список_идентификаторы)
  4. SELECT ... WHERE P_ID IN ($ список_идентификаторы [0], $ список_идентификаторы [1], $ список_идентификаторы [2])
0

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

1

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

0

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

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

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