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

Posted

技术标签:

【中文标题】MYSQL如果一个选择查询返回0行然后另一个选择查询?【英文标题】:MYSQL if a select query returns 0 rows then another select query? 【发布时间】:2011-03-13 05:57:22 【问题描述】:

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

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

第二次:

SELECT table1.a FROM table1 
WHERE ....

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

【问题讨论】:

您是否有理由要使用单个 MySQL 查询而不是使用程序逻辑和两个单独的查询? Another SELECT if the first SELECT returned an empty set的可能重复 【参考方案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 兼容才能使上述内容正常工作。

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

【讨论】:

谢谢你,史密斯先生。我不知道 SQL_CALC_FOUND_ROWS。 问题似乎是FOUND_ROWS() 会为下一个执行的查询返回一个值,UNION ALL 认为这两个查询是相同的【参考方案2】:

你可以试试……

SELECT *
    FROM mytable
    WHERE x = 1

UNION

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

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

【讨论】:

【参考方案3】:

是的

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

【讨论】:

此查询是否会返回来自 (SELECT * FROM t2) 的行以及任何结果 EXIST(S)?因为在那种情况下我会需要它们...【参考方案4】:

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

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

【讨论】:

【参考方案5】:

最简单的解释是:

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找到一个很好的解释。

【讨论】:

【参考方案6】:

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,此查询的性能几乎等同于任何一个单独的独立查询

【讨论】:

【参考方案7】:

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

【讨论】:

在不显示 SQL 查询的情况下,这怎么是答案?

以上是关于MYSQL如果一个选择查询返回0行然后另一个选择查询?的主要内容,如果未能解决你的问题,请参考以下文章

如果选择查询返回空结果,请在 mysql 中运行另一个选择查询

Presto:如果原始查询未返回任何行,则返回另一个表或虚拟值/表

使用数组的 MySQL 查询

MySQL 查询返回无效行并且非常慢

MySql数据库增删改查常用语句命令

在返回的mysql结果中查找行数(nodejs)