我有下面的查询,我写的如下。实际上,我想得到两个差异。颜色表的颜色。请调查一下,你能告诉我它是优化方式吗?我可以在下面查询其他优化方式吗?
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;
感谢您的帮助。
答案 0 :(得分: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)
(同样可能已经是主键)。添加覆盖索引可能没有性能优势。
答案 1 :(得分:1)
这是另一种选择。我不知道你在礼服桌上有什么专栏,所以你可能不得不打电话给那些你选择和组的人,但这应该有效。
不确定它是否会更快/更慢但是想给你更多选择; - )
这里是sql小提琴,我还展示了如果为叠加给出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
答案 2 :(得分: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