更好的方式来条件偏好sql

adi*_*han 6 php mysql sql

我有一个名为items如下的表:

id oId key    value
1  0   color  green
2  0   size   30
3  1   color  red 
4  2   color  blue
Run Code Online (Sandbox Code Playgroud)

上面的行oId=0指定了项的默认值.
我需要选择所有的key,value与特定的项目oId,其中将包括(OID = 0),如果特定的默认key,并valueoId不存在.

例如.对于第2项,它应该返回

id oId key   value
1  0   size  30
2  2   color blue
Run Code Online (Sandbox Code Playgroud)

我写了以下查询:

SELECT * FROM items AS i
WHERE i.oId=0 AND
i.key NOT IN (SELECT key FROM items WHERE oId=2) 
UNION ALL
SELECT * FROM items WHERE oId=2
Run Code Online (Sandbox Code Playgroud)

有没有办法优化上面的查询?

小智 1

您可以在右侧索引上使用 JOIN:

SELECT t1.`key`, IFNULL(t2.value, t1.value)
FROM `items` AS t1

LEFT JOIN `items` AS t2
ON t1.`key` = t2.`key` AND t2.`oId` = 2

WHERE t1.`oId` = 0;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle