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


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

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


2137
2017-07-08 09:30


起源

您是否有理由使用单个MySQL查询而不是使用程序逻辑和两个单独的查询?
可能重复 如果第一个SELECT返回一个空集,则为另一个SELECT - Evan Carroll


答案:


这看起来像我刚刚做的快速测试,并避免需要检查是否存在 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兼容才能使上述工作正常。

您更新的问题的答案是否定的。这在单个查询中是不可能的。你需要使用一些 条件程序逻辑 执行所需的查询。


15
2017-07-08 09:46



谢谢你,史密斯先生。我不知道SQL_CALC_FOUND_ROWS。 - Brian Hooper
问题似乎就是这样 FOUND_ROWS() 将为下一个执行的查询返回一个值 UNION ALL 认为两个查询都是相同的 - lurscher


你可以试试......

SELECT *
    FROM mytable
    WHERE x = 1

UNION

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

如果你不认为它是一个可怕的黑客。


1
2017-07-08 09:37





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

0
2017-07-08 09:35



这个查询会从(SELECT * FROM t2)返回行吗?结果是EXIST(S)吗?因为在那种情况下我会需要他们...... - emre
对不起,不行 :) - Haim Evgi


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

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列。


0
2017-07-08 11:34





最简单的解释是:

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
2018-02-24 15:20





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
2018-02-12 19:30





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


0
2018-02-12 19:39