Я занимаюсь расширенным поиском велосипедов.У меня есть много столов, к которым мне нужно присоединиться, чтобы найти все, скажем, красные и коричневые велосипеды.Один велосипед может быть более одного цвета!Я сделал этот запрос на данный момент:
SELECT DISTINCT p.products_id, #simple product id
products_name, #product name
products_attributes_id, #color id
pov.products_options_values_name #color name
FROM products p
LEFT JOIN products_description pd
ON p.products_id = pd.products_id
INNER JOIN products_attributes pa
ON pa.products_id = p.products_id
LEFT JOIN products_options_values pov
ON pov.products_options_values_id = pa.options_values_id
LEFT JOIN products_options_search pos
ON pov.products_options_values_id = pos.products_options_values_id
WHERE pos.products_options_search_id = 4 #code for red
OR pos.products_options_search_id = 5 #code for brown
Моя первая проблема - это множество соединений.Таблица Products
в основном содержит идентификатор продукта и его изображение, а таблица Products Description
содержит более описательную информацию, такую как имя (и, конечно, идентификатор продукта).
Тогда у меня есть таблица Products Options Values
, которая содержит всецвета и их идентификаторы.Products Options Search
содержит идентификаторы цвета вместе с идентификатором группы цветов (products_options_search_id).Красный имеет код группы цветов 4 (коричневый - 5).
Продукты и цвета имеют отношение многих ко многим, управляемое внутри Products Attributes
.
Так что мой вопрос в первую очередь: Можно ли делать так много объединений?Я ухудшаю производительность?
Второе: если велосипед будет красного и коричневого цвета, он появится дважды, хотя я использую SELECT DISTINCT
.Думаю, это из-за INNER JOIN
.Можно ли этого избежать, и нужно ли мне удалять двойные числа в моем PHP-коде?
Третье: велосипеды могут быть двухцветными (т.е. черным и синим).Это означает, что есть два ряда для этого велосипеда.Тот, где написано, что цвет черный, а другой - синий.(См. Второй вопрос).Но если я заменю OR
в предложении WHERE
, он удалит обе строки, потому что ни одна из них не удовлетворяет условиям - только продукт.Какой обходной путь для этого?