时间戳转换器

如何在 MySQL 的多对多关系中以逗号分隔的列表中的一个字段连接数据?

日期:2023-02-24     浏览:265    
【中文标题】如何在 MySQL 的多对多关系中以逗号分隔的列表中的一个字段连接数据?【英文标题】:How to concatenate data from one field, in a comma-delimited list, in a many-to-many relationship in MySQL? 【发布时间】:2011-10-12 04:47:06 【问题描述】:

我在人员和部门之间存在多对多关系,因为一个人可以在多个部门。

People          Departments
------          -----------
pID  pName      deptID   deptName
1    James      1        Engineering
2    Mary       2        Research
3    Paul       3        Marketing
                4        Communications

People_Departments
------------------
pID   deptID
1     1
1     2
2     2
2     4
3     1
3     2
3     3

我想要的是这个:

pName  deptName
James  Engineering, Research
Mary   Research, Communication
Paul   Engineering, Research, Marketing

如果我使用下面的 SQL 对表执行简单的 LEFT JOIN,我将获得与一个人相关的几行:

SELECT people.pName,
       departments.deptName
FROM people
LEFT JOIN people_departments ON people.pID=people_departments.pID
LEFT JOIN departments ON people_departments.deptID=departments.deptID

我尝试了GROUP_CONCAT 的各种组合,但没有运气。

有什么想法可以分享吗?

【问题讨论】:

【参考方案1】:
    SELECT people.pName,
           GROUP_CONCAT(departments.deptName SEPARATOR ', ') deptName
      FROM people
 LEFT JOIN people_departments 
        ON people.pID = people_departments.pID
 LEFT JOIN departments 
        ON people_departments.deptID = departments.deptID
  GROUP BY people.pID

输出:

+-------+----------------------------------+
| pName | deptName                         |
+-------+----------------------------------+
| James | Engineering, Research            |
| Mary  | Research, Communications         |
| Paul  | Engineering, Research, Marketing |
+-------+----------------------------------+
3 rows in set (0.00 sec)

【讨论】:

实际上,我的组合都不起作用,因为我省略了非常重要的 GROUP BY。我在实际项目中从几个多对多相关的表中获取数据,并在您的帮助下设法获得了我想要的数据。再次感谢! 请注意,在此查询中,people_departments 的 LEFT JOIN 将被转换为 INNER JOIN,因为在 INNER JOIN 的 ON 子句中使用了people_departments.deptID。如果你想列出没有部门的人,两个 JOIN 都应该是 LEFT JOIN。 @PaulSpiegel 很好。更新了查询。【参考方案2】:

我的解决办法是:

SELECT people.pName,
GROUP_CONCAT(tmp.deptName SEPARATOR ', ') deptName
FROM people 
LEFT JOIN (SELECT people_departments.pID, departments.deptName FROM people_departments LEFT JOIN departments  ON people_departments.deptID = departments.deptID) as tmp
ON tmp.pID = people.pID
GROUP BY people.pID

结果:

+-------+----------------------------------+
| pName | deptName                         |
+-------+----------------------------------+
| James | Engineering, Research            |
| Mary  | Research, Communications         |
| Paul  | Engineering, Research, Marketing |
+-------+----------------------------------+

【讨论】:

相关文章

与对象的多对多关系,其中存在中间字段?

{】与对象的多对多关系,其中存在中间字段?【英文标题】:Many-to-manyrelationshipswithobjects,whereintermediatefieldsexist?【发布时间】:2012-08-1815:19:11【问题描述】:我正在尝试在我的工作场所构建服务器和应用程序的模型。一台服务器...}

mysql - 来自桥接表的多对多查询[关闭]

{】mysql-来自桥接表的多对多查询[关闭]【英文标题】:mysql-manytomanyqueryfrombridgetable[closed]【发布时间】:2017-01-1905:19:51【问题描述】:我有一个任务要完成。有一个多对多的关系。桥表已经制作完成,看起来像leftidrightid+----------+-...}

刀片模板中的多对多关系中的 Laravel 嵌套查询

{】刀片模板中的多对多关系中的Laravel嵌套查询【英文标题】:LaravelNestedQueryinManytoManyRelationshipfromwithinBladeTemplate【发布时间】:2020-11-0814:23:45【问题描述】:我试图根据角色隔离不同的团队成员,在刀片视图的$teams中将它们过滤...}

如何在 django 中处理未保存的多对多关系?

{】如何在django中处理未保存的多对多关系?【英文标题】:Howtoworkwithunsavedmany-to-manyrelationsindjango?【发布时间】:2010-10-0519:30:34【问题描述】:我在django中有几个模型,它们是多对多连接的。我想在内存中创建这些模型的实例,...}

如何保存具有直通关系的多对多字段

{】如何保存具有直通关系的多对多字段【英文标题】:HowtosaveaManyToManyfieldwithathroughrelationship【发布时间】:2015-10-3000:07:43【问题描述】:我有以下具有ManyToMany和through关系的模型:classMeeting(models.Model):site=models.ForeignKey(Site)meeting_...}

如何在 Ruby on Rails 中管理嵌套字段的多对多关系

{】如何在RubyonRails中管理嵌套字段的多对多关系【英文标题】:HowtomanagemanytomanyrelationfornestedfieldsinRubyonRails【发布时间】:2019-04-2511:20:41【问题描述】:classResume<ActiveRecord::Basehas_many:user_skills,:dependent=>:destroyaccepts_nested_attr}

如何在没有中间表的情况下处理 Django 中的多对多关系?

{】如何在没有中间表的情况下处理Django中的多对多关系?【英文标题】:HowtohandleMany-to-ManyRelationinDjangowithoutanIntermediaryTable?【发布时间】:2021-12-0222:39:55【问题描述】:我继承了一个奇怪的表结构:classCustomer(models.Model):account_num...}

与backbone.js的多对多关系事件

{...服务器端的数据透视表实现了多对多关系。我试图弄清楚如何在客户端构建它。我目前的结构是:1)我有一个Tag模型和一个呈现复选框和标签标签的TagView,我在复选框上有一个选中的事件,目前什么都不做}

Django,在 self 类中的多对多关系中,我如何在 ORM 方面相互引用?

{】Django,在self类中的多对多关系中,我如何在ORM方面相互引用?【英文标题】:Django,inmanytomanyrelationshipwithintheselfclass,howdoIreferenceeachotherintermsofORM?【发布时间】:2018-02-0112:40:51【问题描述】:classUser(models.Model):name=models.CharField(m...}

如何直接填充由 EF Core 生成的多对多关系连接表?

{】如何直接填充由EFCore生成的多对多关系连接表?【英文标题】:HowcanIdirectlyfilljointablegeneratedbyEFCoreformany-to-manyrelationship?【发布时间】:2021-04-0703:54:58【问题描述】:我有这些实体:publicclassBookpublicintIdget;set;publicstringTitleget;set;...}

Copyright ©2021 时间戳转换器 小常识 114pp | 陕ICP备18005036号