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