Уменьшить ВНУТРЕННИЕ СОЕДИНЕНИЯ - PullRequest
0 голосов
/ 26 мая 2011

У меня есть следующий SQL-Select (SQLite / MySQL):

SELECT products.* FROM products
INNER JOIN specifications AS spec1 ON specifications.product_id = product.id
INNER JOIN specifications AS spec2 ON specifications.product_id = product.id

WHERE products.language = "de"
AND products.category = "ABC"


AND (spec1.name = 'Innenabmessungen' AND spec1.value = '182x53')
AND (spec2.name = 'Farbe'            AND spec2.value = 'schwarz')

Есть ли решение использовать только один INNER JOIN? Проблема в том, что я хочу сделать SELECT с более чем двумя spec-фильтрами. Это возможно?

1 Ответ

1 голос
/ 26 мая 2011

Если вы хотите вернуть значения из обеих записей в таблицу спецификаций, то это нельзя упростить, так как в таблице спецификаций требуются два поиска

Однако в вашем примере вы можете переписать его следующим образом:

SELECT products.* FROM products

WHERE products.language = "de"
AND products.category = "ABC"
AND (SELECT COUNT(*) FROM specifications WHERE 
(specifications.name = 'Innenabmessungen' AND specifications.value = '182x53' AND specifications.product_id = product.id) OR
(specifications.name = 'Farbe' AND specifications.value = 'schwarz' AND specifications.product_id = product.id)
) = 2

Хотя я не думаю, что будет повышение производительности, если вы сначала не выполнили поиск в таблице спецификаций, чтобы найти строки с соответствующим product_id, а затем искали имена / значения

Очевидно, что вам нужно будет проиндексировать поля product_id, name и value в таблице спецификаций, а также поля productid, language и category в таблице products.

...