【发布时间】: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_id或id_people。)不要在ref表中命名相同的东西People。给它同样的名字。那么,为什么是IdCol?为什么不是IdColor,因为它是颜色表中颜色的ID?对于更大的数据库,缺乏命名约定可能会成为一个问题。 -
@ThorstenKettner 感谢您的建议。我的表实际上并没有这样命名,我只是重命名了它们,以便在没有上下文的情况下更容易理解。
标签: sql mariadb inner-join group-concat