如何从MySQL 5.7中的规范化Shema检索数据集?

时间:2018-12-31 15:52:56

标签: mysql sql

我正在尝试从规范化的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

这怎么办?

1 个答案:

答案 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;

enter image description here

Demo

GROUP_CONCAT在这里的工作方式是忽略聚合中的NULL值,然后将这些值不添加到串联字符串中。还要注意,根据您的MySQL版本,您可能必须同时GROUP BY表中的idtitle