【发布时间】:2010-06-09 11:39:11
【问题描述】:
我正在开发自行车的高级搜索。我有很多表格需要加入才能找到所有表格,比如说红色和棕色的自行车。一辆自行车可能有不止一种颜色!我现在已经做了这个查询:
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 表主要保存产品 ID 及其图像,Products Description 表保存更多描述性信息,例如名称(当然还有产品 ID)。
然后我有一个 Products Options Values 表,其中包含所有颜色及其 ID。 Products Options Search 包含颜色 ID 和颜色组 ID (products_options_search_id)。红色的颜色组代码为 4(棕色为 5)。
产品和颜色在Products Attributes内部管理着多对多的关系。
所以我的问题首先是:进行这么多连接可以吗?我会影响性能吗?
第二:如果一辆自行车有红色和棕色两种颜色,即使我使用SELECT DISTINCT,它也会出现两次。认为这是因为INNER JOIN。这是否可以避免,我是否必须删除我的 PHP 代码中的双精度值?
第三:自行车可以是双色的(即黑色和蓝色)。这意味着该自行车有两排。一个说颜色是黑色,一个说是蓝色。 (见第二个问题)。但是,如果我在 WHERE 子句中替换 OR ,它会删除两行,因为它们都不满足条件 - 只有产品。解决方法是什么?
【问题讨论】: