首页 > 解决方案 > 第一本书数据库问题:显示多个作者和多个书籍主题(但主题被重复)

问题描述

所以我从 SQL 开始(一些 Code Academy 知识和一些谷歌搜索),我目前正在用 MySQL 构建自己的书籍数据库来练习。

我的问题是,当一本书有多个作者和多个主题时,我的查询返回作者数乘以主题数,主题数乘以作者数。

与问题相关,我有下表仅包含相关列(它很简单,所以我只用文本显示它,每个 '%id' 列都是整数):

表(列):

我希望我的查询返回此表:

ID 标题 作者 主题
1 标题1 N1 1
2 标题2 N2 2
3 标题3 N2、N3 2、3
4 标题4 N4、N5、N6 2、3

所以我尝试了这段代码,我在这里找到了哪种模式:

SELECT e.id, 
    e.title, 
    GROUP_CONCAT(full_name) AS author,
    GROUP_CONCAT(theme_name) AS themes
FROM ebooks e
JOIN ebooks_authors ea
     ON e.id = ea.ebook_id
JOIN authors a
     ON a.id = ea.author_id
JOIN ebooks_themes et
     ON e.id = et.ebook_id
JOIN theme t
     ON t.id = et.theme_id
GROUP BY e.id;

如果我不添加涉及主题的部分,我每行都有正确数量的作者,但是添加了与主题相关的代码,我有一些东西,例如:

Book_id 标题 作者 主题
1 标题1 N1 1
2 标题2 N2 2
3 标题3 N2、N3、N2、N3 2、3、2、3
4 标题4 N4、N4、N5、N5、N6、N6 2, 2, 2, 3, 3, 3

我尝试对 e.id 和 t.id 进行 GROUP BY,但它为每个主题创建了一行,并在有多个作者的地方复制了 theme_name。

我真的不知道我正在搜索什么样的函数,或者我是否可以通过 WITH 子句或子查询获得我想要的东西。

有人可以帮我获得这篇文章中的第一张桌子吗?

(如果描述太长,我很抱歉,但是)谢谢您的关注!

标签: mysqlsqldatabase

解决方案


你可以添加一个DISTINCT和一个ORDER BYGROUP_CONCAT

SELECT e.id, 
    e.title, 
    GROUP_CONCAT(DISTINCT full_name) AS author,
    GROUP_CONCAT(DISTINCT theme_name) AS themes
FROM ebooks e
JOIN ebooks_authors ea
     ON e.id = ea.ebook_id
JOIN authors a
     ON a.id = ea.author_id
JOIN ebooks_themes et
     ON e.id = et.ebook_id
JOIN theme t
     ON t.id = et.theme_id
GROUP BY e.id;

推荐阅读