gpt4 book ai didi

mysql - 多对多表加入数据透视表

转载 作者:可可西里 更新时间:2023-11-01 06:32:47 26 4
gpt4 key购买 nike

我目前有两个类似于 usersprograms 的表,它们通过 link 通过多对多关系链接在一起表。

mysql> select * from users;
+----+----------+
| id | name |
+----+----------+
| 1 | Jonathan |
| 2 | Little |
| 3 | Annie |
| 4 | Bob |
+----+----------+
4 rows in set (0.00 sec)

mysql> select * from programs;
+----+----------------------+
| id | name |
+----+----------------------+
| 1 | Microsoft Word |
| 2 | Microsoft Excel |
| 3 | Microsoft PowerPoint |
+----+----------------------+
3 rows in set (0.00 sec)

mysql> select * from link;
+---------+------------+
| user_id | program_id |
+---------+------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 2 |
| 3 | 1 |
| 3 | 4 |
+---------+------------+
6 rows in set (0.00 sec)

我了解如何连接表并返回这种类型的结果:

mysql> select users.name, programs.name from linker
-> join users on users.id = linker.user_id
-> join programs on programs.id = linker.program_id;
+----------+----------------------+
| name | name |
+----------+----------------------+
| Jonathan | Microsoft Word |
| Jonathan | Microsoft Excel |
| Jonathan | Microsoft PowerPoint |
| Little | Microsoft Excel |
| Annie | Microsoft Word |
+----------+----------------------+

但我真正要找的东西有点复杂:

+----------+-----------------------------------------------------+
| name | name |
+----------+-----------------------------------------------------+
| Jonathan | Microsoft Word,Microsoft Excel,Microsoft PowerPoint |
| Little | Microsoft Excel |
| Annie | Microsoft Word |
+----------+-----------------------------------------------------+

我假设有一个 GROUP_CONCAT() 被扔到命令的某处,但我似乎无法阻止结果看起来像这样:

mysql> select users.name, group_concat(programs.name) from linker
-> join users on users.id = linker.user_id
-> join programs on programs.id = linker.program_id;
+----------+------------------------------------------------------------------------------------+
| name | group_concat(programs.name) |
+----------+------------------------------------------------------------------------------------+
| Jonathan | Microsoft Word,Microsoft Excel,Microsoft PowerPoint,Microsoft Excel,Microsoft Word |
+----------+------------------------------------------------------------------------------------+

谁能指出我正确的方向?

最佳答案

你需要指定一个DISTINCT,即

select users.name, group_concat( DISTINCT programs.name)

参见 MySQL 文档 here .

尝试将您的查询更改为:

SELECT users.name, group_concat(programs.name) 
from users
LEFT JOIN linker on linker.user_id = users.id
LEFT JOIN programs on linker.program_id = programs.id
GROUP BY users.id

这将为您提供一个 null 给任何没有与之关联的程序的用户。要过滤掉它们,只需添加 WHERE programs.id IS NOT NULL

关于mysql - 多对多表加入数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6113869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com