【问题标题】:SQL join + group_concat not returning some rowsSQL join + group_concat 不返回某些行
【发布时间】:2021-03-06 03:58:56
【问题描述】:

在我的数据库中,我有以下表格:

People
+-----------+------------+
| IdPeople  | Name       |
+-----------+------------+
|         1 | James      |
|         2 | Chris      |
+-----------+------------+

ref
+---------+-------------+------+
| People  | Color       | Code |
+---------+-------------+------+
|       1 |           2 |    1 |
|       1 |           1 |    2 |
|       1 |           6 |    3 |
|       2 |           1 |    1 |
|       2 |           6 |    4 |
|       2 |           4 | NULL |
|       2 |           5 | NULL |
+---------+-------------+------+

Colors
+--------+--------------------+
| IdCol  | Color              |
+--------+--------------------+
|      1 | Blue               |
|      2 | Green              |
|      3 | Yellow             |
|      4 | Red                |
|      5 | Black              |
|      6 | White              |
+--------+--------------------+

Codes
+--------+----------------+
| IdCode | Code           |
+--------+----------------+
|      1 | C++            |
|      2 | JavaScript     |
|      3 | Python         |
|      4 | HTML           |
+--------+----------------+

我想加入所有表格以获得这样的结果:

+------------+---------------------------+------------------------------------+
| Name       | Color                     | Code                               |
+------------+---------------------------+------------------------------------+
| Chris      | Blue, White, Red, Black   | C++, HTML                          |
| James      | Green, Blue, White        | C++, JavaScript, Python            |
+------------+---------------------------+------------------------------------+

我尝试像这样加入 group_concat

SELECT People.Name,
       group_concat(Colors.Color separator ", ") AS "Color",
       group_concat(Codes.Code separator ", ") AS "Code"
FROM People
INNER JOIN ref ON People.IdPeople=ref.People
INNER JOIN Colors ON ref.Color=Colors.IdCol
INNER JOIN Codes ON ref.Code=Codes.Code
GROUP BY Name;

但是,由于 group_concat 不返回空行,所以我在 Chris 行中得到了除 Black 和 White 之外的所有内容。我不知道该怎么做,请问有人可以帮我吗?

【问题讨论】:

  • 您使用的是哪个 dbms?
  • @jarlh 我在 Ubuntu 的命令行中使用 MariaDB。
  • 附注:与您的命名保持一致。 IdPeople 是 people 表 ID 的好名字。 (不过,为了便于阅读,我可能更愿意使用people_idid_people。)不要在ref 表中命名相同的东西People。给它同样的名字。那么,为什么是IdCol?为什么不是IdColor,因为它是颜色表中颜色的ID?对于更大的数据库,缺乏命名约定可能会成为一个问题。
  • @ThorstenKettner 感谢您的建议。我的表实际上并没有这样命名,我只是重命名了它们,以便在没有上下文的情况下更容易理解。

标签: sql mariadb inner-join group-concat


【解决方案1】:

由于ref.code可以为null,所以必须外联码表:LEFT OUTER JOIN Codes ON ...

完整的查询:

SELECT People.Name,
       group_concat(Colors.Color separator ", ") AS "Color",
       group_concat(Codes.Code separator ", ") AS "Code"
FROM People
INNER JOIN REF ON People.IdPeople=ref.People
INNER JOIN Colors ON ref.Color=Colors.IdCol
LEFT JOIN Codes ON ref.Code=Codes.Code
GROUP BY Name;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多