检索按类别分组的 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 结果的主要内容,如果未能解决你的问题,请参考以下文章

sql 分组后怎么把结果合并到一个类别下啊

即使没有结果,如何在分组的 MS Access 报告中显示类别

SQL 按年份分组给出不正确的结果

将具有对象属性的数组分组的最佳方法以及如何呈现结果

Oracle - 按类别分组,日期范围[重复]

RSUM - 列排序问题