【问题标题】:Performance in MYSQL , MAX( IF( condition ) ) or Subquery conditionMYSQL , MAX( IF( condition ) ) 或 Subquery 条件中的性能
【发布时间】:2017-11-21 17:50:41
【问题描述】:

我需要在我的表格中搜索额外的字段作为列,它适用于 2 个不同的解决方案:

表格:框

+ -- + ----- + ---- +
| id | name  | vinc |
|----|-------|------|
| 1  | box1  | 22   |
| 2  | box2  | 45   |
| 3  | box3  | 60   |
+ -- + ----- + ---- +

表格:Extr

+ -- + ---- + ----- + ------- +
| 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' 

两者都按框分组,所以我没有重复的行(我认为)供选择。

这些查询具有自动构造函数,因此我不易于使用或在调试后遇到问题。

  • 问题是:哪个是最佳实践和/或具有最佳性能? :)

【问题讨论】:

  • 您的第二个查询缺少 FROM 子句和 GROUP BY

标签: mysql performance entity-attribute-value


【解决方案1】:

另一种选择是加入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 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多