检索按类别分组的 SQL 结果
Posted
技术标签:
【中文标题】检索按类别分组的 SQL 结果【英文标题】:Retrieve SQL results, grouped by categories 【发布时间】:2019-01-03 17:39:47 【问题描述】:sql水平比较低,被屏蔽了,来求你的帮助。
所以我有一个包含我的 2 个表、一个文章表和一个类别表的数据库。在我的文章表中,我有一个字段,它以 JSON 格式包含其所属类别的 ID。
类别表的示意图如下所示:
| Name | id |
| Cat1 | 1 |
| Cat2 | 2 |
| Cat3 | 3 |
还有表格文章:
| Title | id | Categories |
| Title1 | 1 | [1,2] |
| Title2 | 2 | [1,3] |
| Title3 | 3 | [2,3] |
目前,我检索我的文章如下:
SELECT *
FROM articles a
JOIN categories c
ON JSON_CONTAINS(a.categories, CAST(c.id AS CHAR))
然后在 php 中我按类别对它们进行分组。但是我发现这个解决方案不是很干净。
所以我想知道 SQL 查询是否可以通过这种方式检索已经按类别分组的文章列表:
Cat1 - 第 1 条 - 第二条
猫2 - 第 1 条 - 第三条
Cat3 - 第 2 条 - 第三条
【问题讨论】:
你不应该在列中使用逗号分隔值..你应该规范化相关数据 你好,你说的很对,我会在两个表之间放一个中间表来避免逗号。 然后发布正确的数据结构,以便可以正确回答您的问题 【参考方案1】:最好的数据库设计是创建一个新表ArticleCategories
,列出每个文章类别:
ArticleID, CatID
一个 ArticleID 可以有多个 CatID...
现在您可以将多个类别关联到一篇文章,并使用 SQL 轻松搜索这个新数据库以查找类别和文章之间的关联。
SELECT c.category, STRING_AGG(a.title, ',')
FROM articles a
LEFT JOIN articleCategories ac
ON a.id = ac.articleID
LEFT JOIN categories c
ON c.id = ac.categoryID
GROUP BY c.category
【讨论】:
很多人都是这样解决这个问题的。当然还有其他方法,不过这个方法简单有效。 我做了修改,然后再回复你,谢谢你的回答!以上是关于检索按类别分组的 SQL 结果的主要内容,如果未能解决你的问题,请参考以下文章