MYSQL如果一个select查询返回0行然后另一个select查询?

时间:2010-07-08 09:30:44

标签: mysql select conditional if-statement

如果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 ..... 

如果第一个结果为null,则为:

第二

SELECT table1.a FROM table1 
WHERE ....

我将使用第一个查询中的行,如果它返回任何行,否则将使用第二个。

7 个答案:

答案 0 :(得分:15)

这似乎可以通过我刚刚进行的快速测试来完成,并且无需检查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兼容才能使上述工作正常运行。

您更新的问题的答案是否定的。这在单个查询中是不可能的。您需要使用一些conditional procedural logic来执行所需的查询。

答案 1 :(得分:1)

你可以试试......

SELECT *
    FROM mytable
    WHERE x = 1

UNION

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

如果你不认为它太可怕了。

答案 2 :(得分:0)

带有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);

答案 3 :(得分:0)

如果两个查询返回不同数量的列,则可以使用空列填充其中一个结果,并首先添加标识符列。

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的列数比mytable多4列。

答案 4 :(得分:0)

最简单的解释是:

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>

可以找到一个很好的解释here

答案 5 :(得分:0)

SQL_CALC_FOUND_ROWSFOUND_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;

使用JOINUNION ALL,此查询的效果几乎等同于单独的独立查询

答案 6 :(得分:0)

您可以使用EXIST和NOT EXIST语句来检查结果是否为null。如果result为Null,那么你可以从table2获得值。