>我有这样的表格:
-----------------------------------------
| 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
条件在现实世界中更复杂,处理开始和结束时间戳比较。
这个呢(未经测试):
SELECT * FROM table WHERE id = 0 AND NOT EXISTS (SELECT * FROM table WHERE active = 1)
UNION SELECT * FROM table WHERE ACTIVE = 1;
这可能效率不高,但这取决于记录的数量。
在万一的情况下,活动索引可能会有所帮助。
它应该适合您的问题:如果有active = 1
行,它们从联合的第二个查询返回,而第一部分解析为空集(因为EXISTS
子查询将失败)。如果没有,则第二个查询不返回任何内容,而第一部分返回带有 id = 0
的行,因为EXISTS
子查询现在将成功。
将默认消息 (id = 0) 保存在实际的应用程序代码中,只需查询一次并保存即可。使用您在此处编写的查询,如果没有结果,请使用您保存在应用程序代码中的默认消息。
正如Watery的答案所示,您尝试做的事情不是很干净,正如Watery的答案所示,可以在MySQL中完成所有操作,但是它效率不高,也不是处理问题的最佳方法。