MySQL无匹配返回默认记录(无限制)

MySQL无匹配返回默认记录(无限制),mysql,Mysql,我有一张这样的桌子: ----------------------------------------- | ID | ACTIVE | MESSAGE | ----------------------------------------- | 0 | 0 | Default message | ----------------------------------------- | 1 | 1 | Messag

我有一张这样的桌子:

-----------------------------------------
|  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
对我不起作用,因为我需要返回所有
活动的
消息(如果存在),而不仅仅是一条

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

这是什么(未测试):

这可能不是很有效,但取决于记录的数量。
如果是这样的话,在active上建立索引可能会有所帮助

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

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

正如watery的回答所表明的那样,您试图做的事情不是很干净,MySQL中有很多方法可以做到这一点,但这不是有效的,也不是处理问题的最佳方法

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