Использование 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
Если каждому объявлению в базе данных разрешено существовать только в определенном ad_spot, четыре запроса не могут быть оптимизированы в одном. Вам нужно использовать отдельные запросы, потому что вы будете выводить результаты в отдельные места на странице. –
Для каждого объявления ad_spot может быть несколько объявлений. То, что я делаю, запрашивает все объявления перед загрузкой страницы, помещая их в массив и повторяя их в своих конкретных рекламных площадках. – Mark
, даже если они были статическими в определенном месте, ваш запрос может и должен быть объединен в один запрос. 4 вопроса определенно повредят производительности. У вас есть два варианта: вернуть запрос в виде четырех строк и преобразовать его с помощью php или преобразовать четыре строки в 1 строку с 4 столбцами в самом sql-запросе с использованием MAX (IF (ad_spot = 1, ad_name, NULL)) .. и т. д. –