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

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

Например,

Таблица 1: статьи , в этом примере для каждой статьи также хранятся 2 значения

article_id | make | model
1            Audi   A3

Таблица 2: атрибуты article_attributes , где одна статья может иметь несколько атрибутов

article_id | attr_id
1            1
1            2
2            1

Таблица 3: article_attribute_names

attr_id | name
1         Turbo
2         Airbag

Теперь я хочу получить его, по одной строке на набор данных

например

SELECT a.*, attr_n.name AS function
FROM `articles` a
LEFT JOIN article_attributes AS attr ON a.article_id = attr.article_id
LEFT JOIN article_attribute_names AS attr_n ON attr_n.attr_id = attr.attr_id
-- group by attr.article_id

Это даст мне:

article_id | Make | Model  | function
1            Audi   A3       Turbo
1            Audi   A3       Airbag

Но я ищу что-то вроде этого:

article_id | Make | Model  | function1 | function2
1            Audi   A3       Turbo       Airbag

Возможно ли это вообще, и если да, то как?

1 Ответ

0 голосов
/ 29 декабря 2018

Самый простой способ - поместить значения в поле с разделителями, используя group_concat():

SELECT a.*, GROUP_CONCAT(an.name) AS functions
FROM articles a LEFT JOIN
     article_attributes aa
     ON a.article_id = aa.article_id LEFT JOIN
     article_attribute_names aan
     ON aan.attr_id = aa.attr_id
GROUP BY a.article_id;

Агрегировать по article_id можно, предполагая, что идентификатор уникален (или эквивалентно объявлен как первичныйkey).

Если вам действительно нужны результаты в отдельных столбцах, это более сложно.Если вы знаете, что их максимум два (как в вашем примере), просто используйте агрегацию:

SELECT a.*, MIN(an.name) AS function1,
       (CASE WHEN MIN(an.name) <> MAX(an.name)
             THEN MAX(an.name)
        END) as function2
FROM articles a LEFT JOIN
     article_attributes aa
     ON a.article_id = aa.article_id LEFT JOIN
     article_attribute_names aan
     ON aan.attr_id = aa.attr_id
GROUP BY a.article_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...