Составьте запрос на создание групп в одной строке результатов - PullRequest
1 голос
/ 07 февраля 2020

У меня есть две таблицы. Вот так.

select * from extrafieldvalues;
+----------------------------+
| id | value | type | idItem |
+----------------------------+
| 1  | 100   | 1    | 10     |
| 2  | 150   | 2    | 10     |
| 3  | 101   | 1    | 11     |
| 4  | 90    | 2    | 11     |
+----------------------------+
select * from items
+------------+
| id  | name |
+------------+
| 10  | foo  |
| 11  | bar  |
+------------+

Мне нужно сделать запрос и получить что-то вроде этого:

+--------------------------------------+
| idItem  | valtype1 | valtype2 | name |
+--------------------------------------+
| 10      | 100      | 150      | foo  |
| 11      | 101      | 90       | bar  |
+--------------------------------------+

Количество типов дополнительных значений поля является переменным, но каждый элемент ВСЕГДА использует каждое дополнительное поле.

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Если у вас есть только два поля, то для этого есть опция left join:

select i.*, efv1.value as value_1, efv2.value as value_2
from items i left join
     extrafieldvalues efv1
     on efv1.iditem = i.id and
        efv1.type = 1 left join
     extrafieldvalues efv2
     on efv1.iditem = i.id and
        efv1.type = 2 ;

С точки зрения производительности, два объединения, вероятно, быстрее, чем агрегация, и это облегчает введите больше столбцов от items. С другой стороны, условное агрегирование легче обобщается, и производительность меняется незначительно, поскольку к select.

добавляется больше столбцов из extrafieldvalues.
2 голосов
/ 07 февраля 2020

Использовать условное агрегирование

select iditem, 
       max(case when type=1 then value end) as valtype1,
       max(case when type=2 then value end) as valtype2,name
from extrafieldvalues a inner join items b on a.iditem=b.id
group by iditem,name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...