我有两个桌子。这样。
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 |
+--------------------------------------+
额外字段值的类型数量是可变的,但是每一项始终使用每个额外字段。
答案 0 :(得分:2)
使用条件聚合
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
答案 1 :(得分:2)
如果只有两个字段,则可以选择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
引入更多列变得更加容易。另一方面,条件聚合更容易泛化,并且随着extrafieldvalues
中的更多列添加到select
中,性能几乎没有变化。