mysql - 如何在联接中对值进行分组
问题描述
我有两张桌子。一个带有主要数据(消息),第二个带有统计信息(messages_open_history)。
messages:
id | name
1 | m1
2 | m2
3 | m3
4 | m4
messages_open_history:
id | message_id | opened | date
1 | 1 | 0 | 2019-09-01
2 | 1 | 1 | 2019-09-02
3 | 2 | 0 | 2019-09-01
4 | 2 | 0 | 2019-09-02
5 | 2 | 0 | 2019-09-03
6 | 3 | 1 | 2019-09-01
7 | 3 | 0 | 2019-09-02
8 | 4 | 1 | 2019-09-01
我想检查是否打开了任何消息。
id | name | opened
1 | m1 | 1
2 | m2 | 0
3 | m3 | 1
4 | m4 | 1
我试过了:
SELECT m.id, m.name, opened FROM messages m
LEFT JOIN messages_open_history moh
解决方案
使用exists
:
select m.*,
(exists (select 1
from messages_open_history moh
where moh.message_id = m.id and
moh.opened = 1
)
) as ever_opened
from messages m;
这可以利用上的索引messages_open_history(message_id, opened)
。
推荐阅读
- php - 如何在正则表达式中重复分组
- c++ - 为什么每次在 openmp 代码中得到不同的输出?
- django - django 重定向直接应用于所有项目
- flutter - 为什么 x ~/ y 比 (x / y).toInt() 更有效
- php - 为某些属性创建多维数组
- react-native - 在 UIManager 中找不到本机组件
- materialize - 如何使materializecss下拉出现在选择框下方?
- django - 总费用减去总预算
- javascript - 工作“类型”定义文件,有人吗?
- django - The HTML file changed on server is not reflected