如果没有匹配,MySQL返回默认记录(没有LIMIT)

时间:2014-02-27 20:12:51

标签: mysql

我有一张这样的表:

-----------------------------------------
|  ID   |  ACTIVE  |       MESSAGE      |
-----------------------------------------
|   0   |     0    |   Default message  |
-----------------------------------------
|   1   |     1    |   Message one      |
-----------------------------------------
|   2   |     1    |   String two       |
-----------------------------------------
|   3   |     0    |   Text three       |
-----------------------------------------

我一直在寻找一个MySQL查询的几个小时,如果没有消息是“活动的”,则显示ID = 0作为默认结果的记录。如果有一条或多条活动消息我想获得这些记录。

SELECT * FROM table WHERE ACTIVE = 1;

此外,一个选项是通过UNION或类似的想法在查询中手动添加默认记录。始终添加默认记录ORDER然后LIMIT 1对我来说不起作用,因为我需要收到所有active条消息(如果已存在),而不仅仅是一条消息。

还有一个约束:我的表和WHERE条件在现实世界中更复杂,处理开始和结束时间戳比较。

2 个答案:

答案 0 :(得分:0)

这个(未经测试):

SELECT * FROM table WHERE id = 0 AND NOT EXISTS (SELECT * FROM table WHERE active = 1)
UNION SELECT * FROM table WHERE ACTIVE = 1;

这可能效率不高,但取决于记录的数量 如果有活跃的索引可能会有所帮助。

它应该适合您的问题:如果有active = 1行,它们将从union的第二个查询返回,而第一个部分解析为空集(因为EXISTS子查询将失败)。如果没有,则第二个查询返回任何内容,而第一个部分返回带id = 0的行,因为EXISTS子查询现在将成功。

答案 1 :(得分:0)

在您的实际应用程序代码中保存默认消息(id = 0),只需查询一次并保存即可。使用您在那里写的查询,如果没有结果,则使用您在应用程序代码中保存的默认消息。

你要做的事情并不是很干净,有些方法可以在MySQL中完成所有这些,正如watery的回答所示,但它并不是效率高的,也不是解决问题的最佳方法。