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

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

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

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

первый:

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

если результат от 1-го числа равен нулю, тогда:

второй:

SELECT table1.a FROM table1 
WHERE ....

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

Ответ 1

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

SELECT SQL_CALC_FOUND_ROWS *
FROM mytable
WHERE x = 1

UNION ALL

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

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

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

Ответ 2

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

SELECT *
    FROM mytable
    WHERE x = 1

UNION

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

если вы не считаете это слишком страшным взломом.

Ответ 3

вы можете использовать инструкцию EXIST и NOT EXIST, чтобы проверить, что результат равен null или нет. если результат Null, вы можете получить значение из таблицы2.

Ответ 5

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

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.

Ответ 6

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

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>

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

Ответ 7

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 производительность этого запроса почти эквивалентна одному из отдельных автономных запросов