2012-03-05 4 views
3

Использование MySQL и PHP. Я пытаюсь выбрать 4 случайных объявления из таблицы. 1 для adspot 1, 1 для adspot 2, 1 для adspot 3, 1 для adspot 4. Вот что моя таблица выглядит следующим образом:выберите 1 rand() из каждого из 4, где cluses mysql

ad_id | ad_spot | ad_html 

1 | 3 | <ad html> 
2 | 1 | <ad html> 
3 | 4 | <ad html> 
4 | 2 | <ad html> 

Есть около 1200 объявлений в таблице с несколькими записями для каждого рекламного места и записи могут меняться в любое время. Вот запрос я использую, чтобы выбрать 1 случайное объявление для конкретного adspot:

SELECT ad_html FROM ads WHERE ad_spot = '2' ORDER BY RAND() LIMIT 1 

Я приуроченная сценарий, который выбрал все 1200 записей и поместить их в массив PHP, затем случайным образом выбрал 1 для каждого adspot. В среднем это заняло больше времени, чем запуск 4 запросов MySQL с разными предложениями для выбора объявлений с помощью RAND().

Каков наиболее эффективный способ объединения следующих запросов в один запрос?

SELECT ad_html FROM ads WHERE ad_spot = '1' ORDER BY RAND() LIMIT 1 
SELECT ad_html FROM ads WHERE ad_spot = '2' ORDER BY RAND() LIMIT 1 
SELECT ad_html FROM ads WHERE ad_spot = '3' ORDER BY RAND() LIMIT 1 
SELECT ad_html FROM ads WHERE ad_spot = '4' ORDER BY RAND() LIMIT 1 
+0

Если каждому объявлению в базе данных разрешено существовать только в определенном ad_spot, четыре запроса не могут быть оптимизированы в одном. Вам нужно использовать отдельные запросы, потому что вы будете выводить результаты в отдельные места на странице. –

+0

Для каждого объявления ad_spot может быть несколько объявлений. То, что я делаю, запрашивает все объявления перед загрузкой страницы, помещая их в массив и повторяя их в своих конкретных рекламных площадках. – Mark

+0

, даже если они были статическими в определенном месте, ваш запрос может и должен быть объединен в один запрос. 4 вопроса определенно повредят производительности. У вас есть два варианта: вернуть запрос в виде четырех строк и преобразовать его с помощью php или преобразовать четыре строки в 1 строку с 4 столбцами в самом sql-запросе с использованием MAX (IF (ad_spot = 1, ad_name, NULL)) .. и т. д. –

ответ

1
SELECT 
    MAX(IF(row_num = 1, ad_html, NULL)) AS 'ad_space_1', 
    MAX(IF(row_num = 2, ad_html, NULL)) AS 'ad_space_2', 
    MAX(IF(row_num = 3, ad_html, NULL)) AS 'ad_space_3', 
    MAX(IF(row_num = 4, ad_html, NULL)) AS 'ad_space_4' 
FROM 
(
    SELECT 
     @row_num := @row_num + 1 AS 'row_num', 
     ad_html 
    FROM  
     (SELECT 
     @cnt := COUNT(*) + 1, 
     @lim := 4, 
     @row_num := 0 
     FROM 
     ads 
    ) vars 
    STRAIGHT_JOIN 
     (
     SELECT 
     r.*, 
     @lim := @lim - 1 
     FROM  
     ads r 
     WHERE 
     (@cnt := @cnt - 1) 
     AND RAND(203121231) < @lim/@cnt 
    ) i 
) j 

Дайте ему случайное семя каждого запроса с вашего php (отметка времени или такая). В качестве альтернативы вы можете опустить внешний запрос, и внутренний запрос вернет 4 строки, которые вы можете выполнить итерацию в своем php-коде.

0

ORDER BY RAND() очень неэффективен.

Что делать с быстрым запросом COUNT, используя PHP для использования числа и получения (4) случайных чисел, а затем используя эти числа в вашем запросе с помощью IN.

+0

Как бы это повлияло на получение одного объявления для каждого рекламного места 1,2,3,4? – Mark

+0

Вы можете сделать это, используя этот метод. 'SELECT MAX (IF (ad_id = random_number_1, ad_name, NULL) AS 'ad_spot_1', MAX (IF (ad_id = random_number_2, ad_name, NULL) AS 'ad_spot_2' ....' –

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