MYSQL если запрос select возвращает 0 строк, то другой запрос select?

если select * from table where x=1 возвращает 0 строк, затем мне нужно select * from table where x=2 [or some other query]. Возможно ли это сделать в одном запросе MySQL с условным оператором?

Edit: все ответы с UNION работа, но только если оба запроса выбирают из одной таблицы (или таблиц с одинаковым количеством столбцов). Что делать, если второй запрос применяется к другой таблице с соединениями?

позвольте мне записать мои запросы, чтобы сделать вопрос более ясно:

1-я:

SELECT  table1.a, table2.b  from table1 LEFT JOIN table2 ON table2.x= table1.x
WHERE ..... 

если результат от 1-го null тогда:

2-я:

SELECT table1.a FROM table1 
WHERE ....

Я буду использовать строки из 1-го запроса, если он возвращает, в противном случае 2-я будет использоваться.

7 ответов


это, похоже, работает от быстрого теста, который я только что сделал, и избегает необходимости проверять наличие x=1 два раза.

SELECT SQL_CALC_FOUND_ROWS *
FROM mytable
WHERE x = 1

UNION ALL

SELECT *
FROM mytable
WHERE 
FOUND_ROWS() = 0 AND x = 2;

Edit: после вашего разъяснения вопроса, очевидно, 2 запроса должны быть совместимы с UNION для работы выше.

ответ на ваш обновленный вопрос нет. Это невозможно в одном запросе. Вам нужно будет использовать некоторые условная процедурная логика для выполнения нужного запроса.


вы можете попробовать...

SELECT *
    FROM mytable
    WHERE x = 1

UNION

SELECT *
    FROM mytable
    WHERE x = 2 AND
          NOT EXISTS (SELECT *
                          FROM mytable
                          WHERE x = 1);

Если вы не считаете это слишком ужасный Хак.


да

подзапросы с EXISTS или NOT EXISTS

http://dev.mysql.com/doc/refman/5.1/en/exists-and-not-exists-subqueries.html

пример :

SELECT column1 FROM t1 WHERE NOT EXISTS (SELECT * FROM t2);

Если два запроса возвращают разное количество столбцов, вы можете заполнить один из результатов пустыми столбцами, а также сначала добавить столбец идентификатора.

SELECT SQL_CALC_FOUND_ROWS 1 query_type, mytable.*, 
'' col1, '' col2, '' col3, '' col4
FROM mytable
WHERE x = 1

UNION ALL

SELECT 2, mytable2.*
FROM mytable2
WHERE 
FOUND_ROWS() = 0 AND x = 2;

где mytable2 имеет 4 больше столбцов, чем mytable.


самое простое объяснение таково:

SELECT IF(1 = 2,'true','false'); --> false
SELECT IF(1 = 1,' true','false'); --> true
SELECT IF(1 = 2,' true','false'), IF(1 = 1,' true','false'); --> false | true

оператор 'if' предоставляет некоторые функциональные возможности для выбранных значений. Структура примерно такая:

SELECT IF(<your statement>), ...<selected params>... FROM <your tables>

отличное объяснение можно найти здесь.


SQL_CALC_FOUND_ROWS и FOUND_ROWS нельзя использовать в одном запросе, даже если отдельно UNION заявления.

правильный способ сделать это:

WITH  my_cte AS
(
  SELECT * from original_set
)
SELECT * FROM my_cte
UNION ALL
SELECT opt.* FROM optional_set opt JOIN (SELECT count(*) v FROM my_cte) count ON count.v=0;

С JOIN и UNION ALL производительность этого запроса почти эквивалентна любому из отдельных автономных запросов


вы можете использовать Exist и not EXIST оператор, чтобы проверить, что результат равен null или нет. если result равен Null, вы можете получить значение из table2.