我正在尝试从规范化的MySQL 5.7表shema检索数据集,而我正努力获取这些值。
有4个表格:https://www.db-fiddle.com/f/q2PJZVegdWXnpkotN2utu2/0
表1:文章
article_id | title
1 First Car
2 Second Car
表2:articles_attr
article_id | attr_id
1 1
1 2
1 3
1 5
2 3
2 4
表3:attr_groups
attr_id | attr_group_id | attribute
1 1 red
2 2 diesel
3 3 automatic
4 3 airbag
5 3 radio
表4:attr_groups_names
attr_group_id | name
1 color
2 engine
3 features
现在,我想检索具有所有属性的所有数据集(car1,car2,..),其中每组具有多个属性的数据集将被汇总。
例如
article_id | title | color | engine | features
1 Car 1 red diesel automatic,radio
2 ...
组的数量很大(超过20个),因此我想避免参加太多的连接。
我最好的镜头:
SELECT
a.article_id,
a.title,
GROUP_CONCAT(CASE attr.attr_group_id WHEN 26 THEN cat.attr_de END) AS functions,
GROUP_CONCAT(CASE attr.attr_group_id WHEN 27 THEN cat.attr_de END) AS miscellaneous
FROM articles_attr AS attr
INNER JOIN articles a ON a.article_id = attr.article_id
INNER JOIN articles_attr AS cat ON cat.attr_id = attr.attr_id
GROUP BY a.article_id
LIMIT 3
这怎么办?
答案 0 :(得分:1)
您的查询具有正确的基本结构,但是您的CASE
表达式看起来有些偏离。试试这个版本:
SELECT
a.article_id,
a.title,
GROUP_CONCAT(CASE WHEN agn.name = 'color' THEN ag.attribute END) color,
GROUP_CONCAT(CASE WHEN agn.name = 'engine' THEN ag.attribute END) engine,
GROUP_CONCAT(CASE WHEN agn.name = 'features' THEN ag.attribute END) features
FROM articles a
INNER JOIN articles_attr aa
ON a.article_id = aa.article_id
INNER JOIN attr_groups ag
ON ag.attr_id = aa.attr_id
INNER JOIN attr_groups_names agn
ON agn.attr_group_id = ag.attr_group_id
GROUP BY
a.article_id,
a.title;
GROUP_CONCAT
在这里的工作方式是忽略聚合中的NULL
值,然后将这些值不添加到串联字符串中。还要注意,根据您的MySQL版本,您可能必须同时GROUP BY
表中的id
和title
。