если 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-го запроса, если он возвратит кого-либо, то иначе 2-й будет использоваться.
Это, похоже, работает после быстрого теста, который я только что провел, и позволяет избежать необходимости дважды проверять существование 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);
если вы не считаете это слишком отвратительным взломом.
Если два запроса возвращают разное количество столбцов, можно заполнить один из результатов пустыми столбцами, а также добавить сначала столбец идентификатора.
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.
yes
Подзапросы с 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);