2014-09-26 16 views
6

Mam tabeli o nazwie items następująco:lepszy sposób uprzywilejowania stan sql

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

Przede wierszy z oId=0 określa domyślne wartości elementów.
muszę zaznaczyć cały key, value z elementu ze szczególnym oId który obejmie domyślne (OID = 0), jeśli konkretnego key i value dla tego oId nie istnieje.

Na przykład. W pozycji 2, powinien on powrócić

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

Pisałem następujące zapytanie:

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 

Czy istnieje sposób, aby zoptymalizować powyższej kwerendy?

Odpowiedz

1

Można użyć JOIN po prawej indeksie:

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

Zapytanie jest 2 razy szybciej ... dzięki. –

Powiązane problemy