mysql - 第一本书数据库问题:显示多个作者和多个书籍主题(但主题被重复)
问题描述
所以我从 SQL 开始(一些 Code Academy 知识和一些谷歌搜索),我目前正在用 MySQL 构建自己的书籍数据库来练习。
我的问题是,当一本书有多个作者和多个主题时,我的查询返回作者数乘以主题数,主题数乘以作者数。
与问题相关,我有下表仅包含相关列(它很简单,所以我只用文本显示它,每个 '%id' 列都是整数):
表(列):
- 电子书(ID,标题)
- 作者(id,全名)
- ebooks_authors (ebook_id, author_id)
- ebooks_themes (ebook_id, theme_id)
- 主题(id,theme_name)
我希望我的查询返回此表:
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 子句或子查询获得我想要的东西。
有人可以帮我获得这篇文章中的第一张桌子吗?
(如果描述太长,我很抱歉,但是)谢谢您的关注!
解决方案
你可以添加一个DISTINCT
和一个ORDER BY
到GROUP_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;
推荐阅读
- caching - 如何在 Web 开发时可靠地清除 Safari 12.0 中的缓存
- ios - touchesBegan 时 UIBarButtonItem 的扩展
- xml - 为什么我的缩进设置在 Powershell 的 XmlWriter 中被忽略?
- spring-boot - 获取请求未通过授权标头
- java - 如何知道当前触发了哪个测试
- android - android firebase 更新列表消息
- javascript - 解析整数后丢失精度
- c - 偶数斐波那契数 - 欧拉计划,出现一些错误(分段错误(核心转储))
- excel - excel vba 使用限制过滤器找不到 Outlook 2010 约会
- javascript - 如何在 setTimeout() 中设置构造函数对象的值?