php - MySQL 多重左连接与可能的空记录

标签 php mysql sql join multiple-tables

所以我第一次接触 MySQL 中的 JOIN,我有以下设置:

表:用户 字段:id, name, ...其他字段...

还有几个“组”表,每个表都有自己独特的数据,就像这样

表:user_group_1 字段:user_id,...group_1 唯一字段...

表:user_group_2 字段:user_id,...group_2 唯一字段...

表:user_group_X 字段:user_id,...group_X 唯一字段...

我正在尝试执行与此类似的查询:

SELECT user.name as name, [...etc...], CONCAT( group_a.data_a,',', group_b.data_b,',', group_c.data_c ) 作为 user_groups 来自用户 LEFT JOIN user_group_1 as group_a ON group_a.user_id=user.id LEFT JOIN user_group_2 as group_b ON group_b.user_id=user.id LEFT JOIN user_group_3 as group_c ON group_c.user_id=user.id

它可以从我的用户表中收集所有数据,但我的 user_groups 是空的。现在,一个用户可以属于任意数量的这些组,因此每个用户在任何或所有这些表中可能有也可能没有记录。 我假设我只是为此使用了错误的 Join 。任何朝着正确方向的插入将不胜感激。

编辑:当我查询用户时,我需要该用户所在的所有 group_x.data_x 字段的列表。例如,如果我查询 user.id=1,并且我知道该用户在组 2 中,但不在组 1 或组 3 中,我希望看到 user_groups 包含:group_b.data_b 但我的 user_groups 字段为空。 我有意包含额外的逗号(而不是使用 CONCAT_WS),因为我需要一种方法来了解 user_groups 数据来自哪个 user_group_x 字段。

最佳答案

更简单的方法是为此使用CONCAT_WS。第一个参数是分隔符,将在每个结果之间插入。如果其中一个字段为 NULL,则将跳过它并且不插入分隔符。

SELECT user.name as name, [...etc...], 
        CONCAT_WS(',', group_a.data_a, group_b.data_b, group_c.data_c ) as user_groups
 FROM user
 LEFT JOIN user_group_1 as group_a ON group_a.user_id=user.id
 LEFT JOIN user_group_2 as group_b ON group_b.user_id=user.id
 LEFT JOIN user_group_3 as group_c ON group_c.user_id=user.id

查看@Bilbo 的回答 here .

和文档 here .

关于php - MySQL 多重左连接与可能的空记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25541219/

相关文章:

php - 防止mysqli中的sql注入(inject)

php - 使用 php 格式化 MySQL/服务器时间戳?

php - 使用 whois 检查子域名

PHP MYSQL 结果不完整

sql - 查询优化

PHP多维数组转简单数组

mysql - Symfony Doctrine : Search in simple_array

java - 我得到了 Jtable 但没有数据

mysql - 多个子查询的SQL SUM操作

mysql - 在数据库负载下以安全的方式替换sql View