Как получить наборы данных из нормализованного Shema в MySQL 5.7? - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь получить наборы данных из нормализованной таблицы таблиц MySQL 5.7, где я пытаюсь получить значения.

Есть 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

Table3: attr_groups

attr_id | attr_group_id | attribute
1         1               red
2         2               diesel
3         3               automatic
4         3               airbag
5         3               radio

Table4: 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 голосов
/ 31 декабря 2018

Ваш запрос имеет правильную базовую структуру, но ваши 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

Демо

GROUP_CONCATработает здесь, игнорируя NULL значения в агрегации, которые затем не добавляются к объединенной строке.Также обратите внимание, что в зависимости от версии MySQL в таблице articles может потребоваться GROUP BY и id, и title.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...