MySQL: выполнить второй запрос, только если первый запрос не возвращает результат - PullRequest
3 голосов
/ 02 декабря 2011

Мне нужен этот запрос:

SELECT * FROM best WHERE best = 'value' AND lang = 'x' 
   UNION 
SELECT * FROM best WHERE best = 'value' AND lang = 'custom' 
LIMIT 1

Обычно мне нужна только одна запись, где best = 'value' и lang = 'x', если эта запись не найдена, мне нужно выполнить второй запрос с lang = 'custom'

Достаточно ли умен MySQL, чтобы понять, что, учитывая наличие LIMIT 1, когда первый запрос объединения возвращает что-то , ему не нужно выполнять второй запрос ?

Чтобы иметь только один запрос, я мог бы сделать:

SELECT * FROM best WHERE best = 'value' AND lang IN ('x','custom') LIMIT 1

Но с этим запросом я не могу сказать, уделить больше внимания записи с lang = 'x'

Ответы [ 3 ]

5 голосов
/ 02 декабря 2011

Вы можете использовать ЗАКАЗ ПО ПОЛЕ () :

SELECT
  *
FROM
  best
WHERE
  best = 'value'
  AND lang IN ( 'x', 'custom' )
ORDER BY FIELD ( lang, 'x', 'custom' )
LIMIT
  1

Это позаботится о вашей «приоритетной» проблеме:)

2 голосов
/ 02 декабря 2011

Правильный ответ - ответ Яна Ханчича (+1)

Но альтернативное решение для более сложных будущих решений и почти независимой от бренда базы данных может быть:

SELECT * FROM (
  SELECT *, 1 as preference 
    FROM best WHERE best = 'value' AND lang = 'x' 
   UNION 
  SELECT *, 2 as preference 
    FROM best WHERE best = 'value' AND lang = 'custom' 
) T ORDER BY preference
LIMIT 1
0 голосов
/ 02 декабря 2011

Вы можете обернуть еще один SELECT вокруг вашего UNION, где вы ORDER BY lang DESC и LIMIT 1.

SELECT * FROM (
  SELECT * FROM best WHERE best = 'value' AND lang = 'x' 
  UNION 
  SELECT * FROM best WHERE best = 'value' AND lang = 'custom' 
)
ORDER BY lang DESC LIMIT 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...