如果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 ....
我将使用第一个查询中的行,如果它返回任何行,否则将使用第二个。
答案 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_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
,此查询的效果几乎等同于单独的独立查询
答案 6 :(得分:0)
您可以使用EXIST和NOT EXIST语句来检查结果是否为null。如果result为Null,那么你可以从table2获得值。