我想知道这个问题是否可以在一个查询中解决:
有三个表:
users (id, name, is_online)
groups (id, name)
user_groups (user_id, group_id)
因此,我需要获得拥有' 1'在is_online
字段中以及所有具有某个标记的组 - 无论用户是否属于某个组。
例如,如果groups
表中只有三个组,则结果如下:
| user_id | group_id | in_group |
| 100 | 1 | 1 |
| 100 | 2 | 0 |
| 100 | 3 | 0 |
| 101 | 1 | 0 |
| 101 | 2 | 0 |
| 101 | 3 | 0 |
| 102 | 1 | 1 |
| 102 | 2 | 1 |
| 102 | 3 | 1 |
我正在考虑使用像完全加入这样的机制,但仍然无法想出如何通过第三个表正确地组合用户和组。
答案 0 :(得分:1)
您必须有CROSS JOIN
个拥有群组的用户才能获得两个表记录之间所有可能组合的列表。然后LEFT JOIN
user_groups
表查看每个组合是否匹配:
SELECT u.id, u.name, IF(ug.user_id IS NOT NULL, 1, 0)
FROM users AS u
CROSS JOIN groups AS g
LEFT JOIN user_groups AS ug ON u.id = ug.user_id AND g.id = ug.group_id
WHERE u.is_online = 1