首页 > 解决方案 > 如何在联接中对值进行分组

问题描述

我有两张桌子。一个带有主要数据(消息),第二个带有统计信息(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

标签: mysqlsql

解决方案


使用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)


推荐阅读