如果 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 ....
如果返回任何行,我将使用第一个查询中的行,否则将使用第二个行。
这看起来像我刚刚做的快速测试,并避免需要检查是否存在 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兼容才能使上述工作正常。
您更新的问题的答案是否定的。这在单个查询中是不可能的。你需要使用一些 条件程序逻辑 执行所需的查询。
你可以试试......
SELECT *
FROM mytable
WHERE x = 1
UNION
SELECT *
FROM mytable
WHERE x = 2 AND
NOT EXISTS (SELECT *
FROM mytable
WHERE x = 1);
如果你不认为它是一个可怕的黑客。
是
具有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 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列。
最简单的解释是:
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>
可以找到一个很好的解释 这里。
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
此查询的性能几乎等同于单个独立查询中的任何一个
您可以使用EXIST和NOT EXIST语句来检查结果是否为null。如果result为Null,那么您可以从table2获取值。