我有三个主表:books
、authors
、publishers
和两个连接表: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/