0

我有以下查询,如下所示。实际上,我想获得两个差异。颜色表中的颜色。请调查一下,你能告诉我这是优化的方式吗?我可以在下面写查询其他优化方式吗?

SELECT d.*, 
(SELECT c.clr_title FROM colors AS c WHERE c.id = d.base_color_id) AS base_color, 
(SELECT c.clr_title FROM colors AS c WHERE c.id = d.overlay_color_id) AS overlay_color  
FROM indira.dress AS d
WHERE id=669;

谢谢你的帮助。

4

3 回答 3

1

这是获得等效结果的另一种方法:

SELECT d.*
     , b.clr_title AS base_color
     , o.clr_title AS overlay_color
  FROM indira.dress d
  LEFT
  JOIN colors b ON b.id = d.base_color_id
  LEFT
  JOIN colors o ON b.id = d.overlay_color_id
 WHERE d.id=669 

SELECT 列表中的相关子查询对于大型集合来说可能很昂贵。但是对于返回单行,这不会是性能问题,因为这些子查询只会执行一次。

在更一般的情况下,对于返回大量行,使用 JOIN 通常更有效。

您可能已经有了合适的索引。为了获得最佳性能,您需要一个索引ON indira.dress(id)(可能已经是主键)和ON colors (id)(同样,可能已经是主键)。添加覆盖索引可能没有性能优势。

于 2013-07-22T18:24:55.620 回答
1

这是另一种选择。我不知道您在梳妆台上有哪些列,因此您可能必须在选择和组中调用您的列,但这应该可以。

不确定它是否会更快/更慢,但想给你更多选择;-)

这是在 sql fiddle 中,我还展示了如果为覆盖提供 null 会发生什么。-> http://sqlfiddle.com/#!2/ebc82/3

SELECT
    d.name
    ,MAX(CASE WHEN d.base_color_id = c.id THEN c.clr_title ELSE NULL END) base_color
    ,MAX(CASE WHEN d.overlay_color_id = c.id THEN c.clr_title ELSE NULL END) overlay_color
FROM
    dress d
INNER JOIN colors c ON 
    c.Id IN (d.base_color_id, d.overlay_color_id)
WHERE
    d.id = 669
GROUP BY 
    d.name
于 2013-07-22T18:28:48.953 回答
0

由于您限制为单个记录,因此可能没问题。但是您总是可以加入两次颜色表,例如:

select
    d.*
    ,base_color.clr_title base_color
    ,overlay_color.clr_title overlay_color
from
    indira.dress d
left join
    colors base_color on d.base_color_id = base_color.id
left join
    colors overlay_color on d.overlay_color_id = overlay_color.id
where
    d.id = 669
于 2013-07-22T18:20:41.250 回答