【问题标题】:sql join through link table merging duplicates comma separated通过链接表合并重复逗号分隔的sql连接
【发布时间】:2017-10-28 01:22:15
【问题描述】:

我有一个经典的三表连接:

  • 书(书名、书名……)
  • 人员(PersonID、姓名、...)
  • PersonBookLink(BookID、PersonID、角色)

我有经典的INNER JOIN

SELECT Book.Title as title, Person.Name as author 
FROM PersonBookLink 
   INNER JOIN Book
      ON PersonBookLink.BookID = Book.BookID
   INNER JOIN Person
      ON PersonBookLink.PersonID = Person.PersonID
;

这按预期工作,但我可能有多个相同Book 的条目,因为它可能有不止一个作者

我想合并这样的记录,每个 Book 只包含一个条目,并以 "Author1, Author2, ..." 的形式合并 author 字段。这可以直接使用 SQL 吗?

我知道我可以以编程方式合并结果集中的记录,但这很麻烦,如果可能的话我想避免。

如果重要的话,我目前正在使用 SQLite3 数据库。

注意:我看到了this answer,但我不需要计算结果,而是将它们连接起来。

【问题讨论】:

    标签: sql join sqlite


    【解决方案1】:

    以下查询可以解决您的问题

    SELECT Book.Title as title, group_concat(Person.Name) as author 
    FROM PersonBookLink 
    INNER JOIN Book ON PersonBookLink.BookID = Book.BookID 
    INNER JOIN Person ON PersonBookLink.PersonID = Person.PersonID 
    GROUP BY Book.Title
    

    如果您不想要单个 ',' 字符,group_concat 将使用可选的第二个参数(字符串)作为连接分隔符。

    【讨论】:

      【解决方案2】:

      您需要GROUP BYGROUP_CONCAT()

      SELECT b.Title, GROUP_CONCAT(p.Name, ', ') as authors
      FROM PersonBookLink pbl INNER JOIN
           Book b
           ON pbl.BookID = b.BookID INNER JOIN
           Person p
           ON pbl.PersonID = p.PersonID
      GROUP BY b.Title;
      

      请注意,我在您的查询中引入了表别名。它们使查询更易于编写和阅读。

      【讨论】:

        猜你喜欢
        • 2021-09-05
        • 2021-09-18
        • 1970-01-01
        • 2013-08-11
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多