MySQL UNION - определите, какой из нескольких SELECT возвращает результат

У меня есть два запроса SELECT, объединенных с UNION. Вот запрос MySQL:

SELECT `id`,`type`,`text`
  FROM my_table 
 WHERE position = '1' 
   AND status = '1' 
   AND targeting = 'all'
UNION
SELECT `id`,`type`,`text` 
  FROM my_table 
 WHERE position = '1' 
   AND status = '1' 
   AND targeting LIKE '%US%'

Как я могу узнать, какой из этих двух запросов SELECT выполняется с TRUE, чтобы получить результат из нужной строки?


person ilnur777    schedule 20.03.2011    source источник


Ответы (1)


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

SELECT 'query1' AS `src`, `id`, `type`, `text`
FROM my_table
WHERE position = '1' AND status = '1' AND targeting = 'all'

UNION ALL

SELECT 'query2' AS `src`, `id`, `type`, `text`
FROM my_table
WHERE position = '1' AND status = '1' AND targeting LIKE '%US%'

Также в этом случае вам вообще не нужен UNION:

SELECT
    targeting LIKE '%US%' AS `targeting_like_us`,
    targeting = 'all' AS `targeting_equals_all`,
    `id`,
    `type`,
    `text`
FROM my_table
WHERE position = '1'
AND status = '1'
AND (targeting LIKE '%US%' OR targeting = 'all')
person Mark Byers    schedule 20.03.2011
comment
@Mark Byers, и как я могу использовать его в своем PHP-скрипте? Расскажите, пожалуйста! - person ilnur777; 21.03.2011
comment
@ilnur777: Что у вас есть на данный момент? Можете ли вы опубликовать свой текущий PHP-скрипт? - person Mark Byers; 21.03.2011
comment
@Mark Byers Мне нужен запрос SELECT, который будет извлекать одну строку из my_table в зависимости от таргетинга, установленного для строки, и отображать ее на месте рекламы. реклама будет показана только для целевых посетителей или для всех посетителей, так как у меня есть сценарий отображения случайного баннера. - person ilnur777; 21.03.2011
comment
Я бы использовал оператор CASE, чтобы вернуть все против %US% в одном столбце, возвращая 1 или 2 в зависимости от совпадения. - person OMG Ponies; 21.03.2011
comment
@OMG Ponies Не могли бы вы опубликовать пример? Спасибо. - person ilnur777; 21.03.2011
comment
@Mark Byers Это условие, которое я должен использовать в PHP-скрипте: if(mysql_num_rows($query) == 1){ echo 'display_banner'; } else { echo 'sorry, no banner found...'; }? - person ilnur777; 21.03.2011
comment
@ilnur: что, если он вернет две строки? Ваш пример кода выдаст sorry, no banner found..., что мне кажется неправильным. - person Mark Byers; 21.03.2011
comment
@Mark Byers Может быть, нужно сделать приоритет для таргетинга в запросе MySQL? Как приоритет сначала следует выбрать с таргетингом = 'все'. Если ничего не найдено, то выбор с таргетингом LIKE '%US%'? - person ilnur777; 21.03.2011
comment
@Mark Byers Забыл упомянуть, что у меня LIMIT 0,1 для запросов SELECT. Таким образом, он всегда будет получать только одну строку. - person ilnur777; 21.03.2011
comment
@ ilnur777: Вы можете использовать ORDER BY condition DESC LIMIT 1, чтобы убедиться, что если есть две строки, одна с условием = true, а другая с условием = false, то возвращается строка с условием = true, например ORDER BY targetting = 'all' DESC LIMIT 1. - person Mark Byers; 21.03.2011