mysql - 连接多个表和 GROUP_CONCAT

标签 mysql sql

我有三个主表:booksauthorspublishers 和两个连接表:authors_on_books & books_on_publishers

我正在尝试使用以下查询获取所有数据:

select books.*, 
        GROUP_CONCAT(authors.id) as author_id, GROUP_CONCAT(authors.name) as author_name,
        GROUP_CONCAT(publishers.id) as publisher_id, GROUP_CONCAT(publishers.name) as publisher_name

        from books
        join authors_on_books on authors_on_books.book_id = books.id
        join authors on authors_on_books.author_id = authors.id
        join books_on_publishers on books_on_publishers.book_id = books.id
        join publishers on books_on_publishers.publisher_id = publishers.id
        group by books.id

我得到的结果是:

[id] => 1
[title] => Title 1
[description] => This is a book
[year_published] => 1999
[isbn] => 11111111
[author_id] => 1,1,2,2,3,3
[author_name] => author 1,author 1,author 2,author 2,author 3,author 3
[publisher_id] => 1,1,1,1,1,1
[publisher_name] => publisher 1,publisher 1,publisher 1,publisher 1,publisher 1,publisher 1

但期望的结果是:

[id] => 1
[title] => Title 1
[description] => This is a book
[year_published] => 1999
[isbn] => 11111111
[author_id] => 1,2,3
[author_name] => author 1,author 2,author 3
[publisher_id] => 1,2
[publisher_name] => publisher 1,publisher 2

最佳答案

你应该在 group_concat 中使用 distinct

  select books.*, 
    GROUP_CONCAT(distinct uthors.id) as author_id, 
    GROUP_CONCAT(distinct authors.name) as author_name,
    GROUP_CONCAT(distinct publishers.id) as publisher_id, 
    GROUP_CONCAT(distinct publishers.name) as publisher_name

    from books
    join authors_on_books on authors_on_books.book_id = books.id
    join authors on authors_on_books.author_id = authors.id
    join books_on_publishers on books_on_publishers.book_id = books.id
    join publishers on books_on_publishers.book_id = publishers.id
    group by books.id

但是记住group_concat(distinct...)对性能有一定的影响..

按照 gordon linoff 的建议,您可以使用左连接来确保获取所有书籍

  select books.*, 
    GROUP_CONCAT(distinct uthors.id) as author_id, 
    GROUP_CONCAT(distinct authors.name) as author_name,
    GROUP_CONCAT(distinct publishers.id) as publisher_id, 
    GROUP_CONCAT(distinct publishers.name) as publisher_name

    from books
    left join authors_on_books on authors_on_books.book_id = books.id
    left join authors on authors_on_books.author_id = authors.id
    left join books_on_publishers on books_on_publishers.book_id = books.id
    left join publishers on books_on_publishers.book_id = publishers.id
    group by books.id

关于mysql - 连接多个表和 GROUP_CONCAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48844775/

相关文章:

sql - Postgres 查询包含某些内容的 JSON 数组

sql - 帮助数据库结构

MySQL - 正则表达式搜索在找到匹配行时正常工作,否则不正常

sql - PIVOT SQL 数据和填空

mysql - 查询中的问题。不工作

php - 使用服务器端的表排序/搜索

mysql - 将 MySQL 文件导入 Oracle SQL Developer

mysql - SQL存储过程

php - 无法根据此查询获得库存不足的商品

SQL:选择属于排除类别的记录,这些记录仅属于排除类别