php - 检索 SQL 结果,按类别分组

标签 php mysql sql pdo

我的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 查询是否可以检索已按类别分组的文章列表:

类别1
- 第 1 条
- 第 2 条

类别2
- 第 1 条
- 第 3 条

Cat3
- 第2条
- 第 3 条

最佳答案

最好的数据库设计是创建一个新表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

关于php - 检索 SQL 结果,按类别分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54027201/

相关文章:

php - Doctrine 2 像在数据库中一样使用表列,而不是 camelCase

php - 为什么 Magento 在生成 ID 后无法保存客户?

mysql - LEFT JOIN 和 COUNT 两个查询的区别

php - 无法从站点的子目录加载 MYSQL 驱动程序,可以从主目录加载

php - 在 Ubuntu 16.04 上安装 FPDI

php - 使用ajax和php在下拉列表中动态更新谷歌图表

php - Mysql 总是返回 1

mysql - 带有多个 OR 的 Where 子句

sql - SQL Server 数据库中的排序列表

mysql - 从第一优先级 mySql 的行中选择指定的项目