2014-09-26 43 views
6

更好的方式我有一个表命名items如下:到条件优先SQL

id oId key value 
1 0 color green 
2 0 size 30 
3 1 color red 
4 2 color blue 

以上行与oId=0指定项目的默认值。
我需要选择所有keyvalue的项目与特定oId其中将包括默认(OID = 0),如果特定keyvalueoId不存在。

例如,就第2项,它应该返回

id oId key value 
1 0 size 30 
2 2 color blue 

我写了下面的查询:

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 

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

回答

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; 

SQLFiddle

+0

您所查询的是快2倍...谢谢。 – 2014-09-27 05:48:12