MySQL SELECT, только если не совпадает - PullRequest
2 голосов
/ 17 марта 2011

Я пытаюсь сделать выбор из таблицы на основе значения поля имени.

Я хочу соответствовать только определенным критериям, если запись не основана на первом, т. Е.

, если следующее соответствует:

WHERE name='version'

если это так, верните эту строку, если нет, поищите их тоже:

ГДЕ name = 'v' ИЛИ ​​name = 'e' ИЛИ ​​name = 'r' и т.д ...

Возможно ли это в одном запросе?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 17 марта 2011
SELECT ...
FROM ..
WHERE name = 'version'
UNION ALL
SELECT ...
FROM ...
WHERE NOT EXISTS (
      SELECT ...
      FROM ..
      WHERE name = 'version'
      ) AND name IN ('v', 'e', 'r', ...) 

РЕДАКТИРОВАТЬ:
Не знаете, как проверить, будет ли mysql кэшировать результаты первого запроса, но при условии, что вы запустите запрос в новом сеансе:

SELECT @cached:=1, ...
FROM ..
WHERE name = 'version'
UNION ALL
SELECT 2, ...
FROM ...
WHERE @cached IS NULL AND name IN ('v', 'e', 'r', ...) 

должно работать

Если в том же сеансе вы хотите очистить @cached с помощью

SELECT @cached:=1, ...
FROM .., (SELECT @cached:=0) x
WHERE name = 'version'
UNION ALL
SELECT 2, ...
FROM ...
WHERE @cached = 0 AND name IN ('v', 'e', 'r', ...) 
1 голос
/ 17 марта 2011
select ...
from ..
where (name = 'version') or (name in ('v', 'e', 'r', ...))

Хотя, поскольку вы основываете сравнение на одном и том же поле, нет разницы между вышеприведенной версией и

...
where (name in ('version', 'v', 'e', 'r', ...))
...