Оптимизировать 2 MySQL запросов в один - PullRequest
0 голосов
/ 19 июня 2011

Использование php и mysql 5.x.В настоящее время я загружаю изображение баннера в определенный раздел моего сайта следующим образом:

SELECT * FROM banners WHERE section = 1 AND pageid = 2

Но если результатов не найдено, я запускаю второй запрос:

SELECT * FROM banners WHERE section = 1 AND pageid = 0

В основном то, что я делаю, этопытаясь найти изображения баннера, назначенные этому разделу для этой страницы.Если результатов не найдено, я ищу изображения баннеров по умолчанию во втором запросе.Есть ли лучший способ, где я могу сделать это в одном запросе?

РЕДАКТИРОВАТЬ

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

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Чтобы лучше объяснить, для чего это нужно.В инструменте администратора я позволяю кому-то назначить изображение баннера для раздела на сайте.В инструменте администратора они могут выбрать раздел и страницу, на которой они хотят показывать изображение баннера.Они также могут установить изображения баннера по умолчанию для этого раздела.Таким образом, если не было изображений баннера, назначенных разделу по умолчанию, он загрузит изображения баннера, присвоенные 0 для этого раздела на всем сайте.Таким образом, вместо назначения изображения баннера по умолчанию для 50 различных страниц, они могут просто сделать это один раз, и он загрузит изображение баннера по умолчанию или изображения для этого раздела.Просто пытаясь найти способ сделать это более оптимальным способом, вместо 2-х запросов, можно ли это сделать за один?

Ответы [ 2 ]

3 голосов
/ 19 июня 2011

Оператор OR заставит условное (pageid = 2 OR pageid = 0) вернуть true немедленно, если только первое значение равно true, и поскольку существует LIMIT 1, я думаю, что он всегда должен извлекать единицу с pageid = 2 первым порядок pageid равен DESC, а 2 больше 0.

SELECT * FROM banners WHERE section = 1 AND (pageid = 2 OR pageid = 0) ORDER BY pageid DESC LIMIT 1

РЕДАКТИРОВАТЬ : Я не уверен, если ORDER BY необходим, я хотел бы видеть некоторые комментарии по этому

0 голосов
/ 19 июня 2011

Возможно, это не самый элегантный способ, но вы можете попробовать это:

SELECT * 
FROM banners 
WHERE section = 1 
AND pageid = IF(
    (select count(*) from banners where section = 1 and pageid = 2) = 0, 
    0, 2
);
...