我有下面的查询,我写的如下。事实上,我想从颜色表中得到两种不同的颜色。请调查一下,你能告诉我这是优化的方式吗?我可以在下面写查询其他优化的方式吗?
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;
谢谢你的帮助。
这里有另一种获得等效结果的方法:
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)
(同样,可能已经是主关键字)。添加覆盖指数可能不会带来性能上的好处。
这里是另一个选项。我不知道你在梳妆台上有哪些栏目,所以你可能不得不把你在选择和分组中列出的栏目都列出来,但这应该有效。
不确定它是否会更快/更慢,但想给你更多的选择;-)
这里是在sqlfiddle中,我还展示了如果覆盖为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
由于您限制为一条记录,所以这可能很好。但你总是可以加入两次颜色表,比如:
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