mysql - 是否可以通过第三个表将一个表中的所有字段与其他表中的所有字段进行匹配?

标签 mysql sql

我想知道是否可以在一个查询中解决这个问题:

一共有三个表:
用户(id, name, is_online)
组(id,名称)
user_groups (user_id, group_id)

因此,我需要获得在 is_online 字段中具有“1”的用户和所有带有标记的组的组合——无论该用户是否属于某个组。

例如,如果 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        |

我正在考虑使用某种机制,如完全连接,但仍然无法想出如何通过第三个表正确组合用户和组。

最佳答案

您必须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

Demo here

关于mysql - 是否可以通过第三个表将一个表中的所有字段与其他表中的所有字段进行匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36077448/

相关文章:

sql - 如何在SAS Proc SQL中编写条件where语句?

SQl server 2008权限和加密

php - 群组消息传递的数据库设计

php - 从 $_GET 获取值并将其用作 ID

c++ - eclipse-cdt boost\shared_ptr.hpp : no such file in directory, 但它是包含文件的一部分

mysql - Delphi - 在运行时创建 MySQL 数据库

SQL 代替触发器

mysql - 如何调优mysql慢查询?

php - 如何在 Laravel 5.2 中更新用户表

mysql - 向 INNER JOIN SQL 查询添加附加列