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

标签 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 条件在现实世界中更加复杂,需要处理开始和结束时间戳比较。

最佳答案

这个怎么样(未经测试):

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 子查询现在将成功。

关于MySQL 如果没有匹配则返回默认记录(没有 LIMIT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22079322/

相关文章:

php - MySQL SUM、ORDER BY 等

mysql - PhpMyAdmin 突然显示错误

mysql - 在 chroot 中运行 mysql

MYSQL - 条件Where语句

javascript - 在 textarea 或 div 的数据库中插入/显示可点击链接

java - 如何批量插入mysql LOAD DATA?

mysql - EntityFramework 包含并可能加入?

php - 如何使用 Fabrik(joomla 组件)表单连接到数据库表并搜索匹配并返回结果?

javascript - 从左到右显示图像php

php - 如何在 GROUP_CONCAT 内使用 CONCAT 限制/偏移查询以在 codeigniter 中创建分页