检索按类别分组的SQL结果

时间:2019-01-03 17:39:47

标签: 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查询是否可以通过这种方式检索已经按类别分组的文章列表:

Cat1
-第1条
-第2条

cat2
-第1条
-第3条

Cat3
-第2条
-第3条

2 个答案:

答案 0 :(得分:0)

最好创建一个新表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

答案 1 :(得分:0)

因此,如scaisEdge和jStaff所建议,我建立了一个中间表,用于存储两个表的ID。

现在我以这种形式获得结果列表,这还不错:

[0]
- Title 1
- Cat 1

[1]
- Title 1
- Cat 2

[2]
- Title 2
- Cat 1

[3]
- Title 2
- Cat 3

[4]
- Title 3
- Cat 2

[5]
- Title 3
- Cat 3

现在是否有可能通过使用GROUP BY将这些结果按类别分组以生成此表单? :

[Cat 1]
- Title 1
- Title 2

[Cat 2]
- Title 1
- Title 3

etc...

谢谢。