MYSQL если запрос на выборку возвращает 0 строк, то другой запрос на выборку? - PullRequest
11 голосов
/ 08 июля 2010

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

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

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

1st:

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

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

2-й:

SELECT table1.a FROM table1 
WHERE ....

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

Ответы [ 7 ]

15 голосов
/ 08 июля 2010

Это похоже на быстрый тест, который я только что сделал, и избавляет от необходимости проверять наличие 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, чтобы вышеприведенные действия работали.

Ответ на ваш обновленный вопрос - Нет.невозможно в одном запросе.Вам нужно будет использовать некоторую условную процедурную логику 1008 * для выполнения желаемого запроса.

1 голос
/ 08 июля 2010

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

SELECT *
    FROM mytable
    WHERE x = 1

UNION

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

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

0 голосов
/ 12 февраля 2018

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

0 голосов
/ 12 февраля 2018

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

0 голосов
/ 24 февраля 2016

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

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>

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

0 голосов
/ 08 июля 2010

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

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.

0 голосов
/ 08 июля 2010

да

подзапросы с 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);
...