MYSQL , MAX( IF( condition ) ) 或子查询条件中的性能
Performance in MYSQL , MAX( IF( condition ) ) or Subquery condition
我需要在 table 上搜索额外字段作为列,它适用于 2 个不同的解决方案:
Table:盒子
+ -- + ----- + ---- +
| id | name | vinc |
|----|-------|------|
| 1 | box1 | 22 |
| 2 | box2 | 45 |
| 3 | box3 | 60 |
+ -- + ----- + ---- +
Table: 提取
+ -- + ---- + ----- + ------- +
| id | vinc | type | value |
+----+------+-------+---------+
| 1 | 22 | color | #fafafa |
| 2 | 22 | size | 100 |
| 3 | 45 | size | 200 |
+ -- + ---- + ----- + ------- +
需要
+ ---- + ---- + ------- +
| name | size | color |
+------+------+---------+
| box1 | 100 | #fafafa |
| box2 | 200 | |
| box3 | | |
+ ---- + ---- + ------- +
我用子查询做到了并且工作了,但有时我需要按 extr.value 的值搜索查询,导致更多过程:
SELECT
box.name
,(select extr.value from ext where extr.name = 'size' and box.vinc = extr.vinc) as size
,(select extr.value from ext where extr.name = 'color' and box.vinc = extr.vinc) as color
... 1 to X extra fields
from box
(sometimes)
where
(select extr.value from ext where extr.name = 'size' and box.vinc = extr.vinc) = 'user_inputed value'
and... 1 to X
或
SELECT
box.name
,MAX( if( extr.name = 'size' , extr.value , '' ) ) as size
,MAX( if( extr.name = 'color' , extr.value , '' ) ) as color
FROM box
LEFT JOIN extr on box.vinc = extr.vinc
WHERE
if( extr.name = 'size' , extr.value , '' ) = 'user_inputed_value'
两者都按方框分组,所以我没有重复行(我认为)select。
这些查询有自动构造函数,所以我不易于使用或在之后调试时遇到问题。
- 问题是:哪种最佳做法 and/or 性能最好? :)
另一种选择是加入 extr
两次。
SELECT b.name, eSize.value AS size, eColor.value AS color
, ...
FROM box AS b
LEFT JOIN extr AS eSize ON b.vinc = eSize.vinc AND sSize.name = 'size'
LEFT JOIN extr AS eColor ON b.vinc = eColor.vinc AND eColor.name = 'color'
WHERE ...
我需要在 table 上搜索额外字段作为列,它适用于 2 个不同的解决方案:
Table:盒子
+ -- + ----- + ---- +
| id | name | vinc |
|----|-------|------|
| 1 | box1 | 22 |
| 2 | box2 | 45 |
| 3 | box3 | 60 |
+ -- + ----- + ---- +
Table: 提取
+ -- + ---- + ----- + ------- +
| id | vinc | type | value |
+----+------+-------+---------+
| 1 | 22 | color | #fafafa |
| 2 | 22 | size | 100 |
| 3 | 45 | size | 200 |
+ -- + ---- + ----- + ------- +
需要
+ ---- + ---- + ------- +
| name | size | color |
+------+------+---------+
| box1 | 100 | #fafafa |
| box2 | 200 | |
| box3 | | |
+ ---- + ---- + ------- +
我用子查询做到了并且工作了,但有时我需要按 extr.value 的值搜索查询,导致更多过程:
SELECT
box.name
,(select extr.value from ext where extr.name = 'size' and box.vinc = extr.vinc) as size
,(select extr.value from ext where extr.name = 'color' and box.vinc = extr.vinc) as color
... 1 to X extra fields
from box
(sometimes)
where
(select extr.value from ext where extr.name = 'size' and box.vinc = extr.vinc) = 'user_inputed value'
and... 1 to X
或
SELECT
box.name
,MAX( if( extr.name = 'size' , extr.value , '' ) ) as size
,MAX( if( extr.name = 'color' , extr.value , '' ) ) as color
FROM box
LEFT JOIN extr on box.vinc = extr.vinc
WHERE
if( extr.name = 'size' , extr.value , '' ) = 'user_inputed_value'
两者都按方框分组,所以我没有重复行(我认为)select。
这些查询有自动构造函数,所以我不易于使用或在之后调试时遇到问题。
- 问题是:哪种最佳做法 and/or 性能最好? :)
另一种选择是加入 extr
两次。
SELECT b.name, eSize.value AS size, eColor.value AS color
, ...
FROM box AS b
LEFT JOIN extr AS eSize ON b.vinc = eSize.vinc AND sSize.name = 'size'
LEFT JOIN extr AS eColor ON b.vinc = eColor.vinc AND eColor.name = 'color'
WHERE ...