gpt4 book ai didi

sql - 具有大量连接的高级 SQL 查询

转载 作者:行者123 更新时间:2023-12-04 22:05:14 26 4
gpt4 key购买 nike

我正在开发对自行车的高级搜索。我有很多表需要加入才能找到所有,比方说,红色和棕色的自行车。一辆自行车可能有不止一种颜色!我现在已经做了这个查询:

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)。

然后我有了包含所有颜色及其 ID 的 Products Options Values 表。 Products Options Search 包含颜色 ID 以及颜色组 ID (products_options_search_id)。红色的颜色组代码为 4(棕色为 5)。

产品和颜色在 Products Attributes 中具有多对多关系。

所以我的问题首先是:做这么多join可以吗?我会影响性能吗?

第二:如果自行车有红色和棕色两种颜色,即使我使用 SELECT DISTINCT,它也会出现两次。认为这是因为 INNER JOIN。这有可能避免吗?我是否必须删除我的 PHP 代码中的 double ?

第三:自行车可以是双色的(即黑色和蓝色)。这意味着那辆自行车有两排。一种是黑色,一种是蓝色。 (见第二个问题)。但是如果我替换 WHERE 子句中的 OR 它会删除两行,因为它们都不满足条件 - 只有产品。解决方法是什么?

最佳答案

好的,首先使用 SQL 进行连接并且您的查询不是很大。如果索引正确,这实际上应该会提高您的性能,因为它更容易获取正确的数据。

您可以使用子查询删除您获得的重复项,如下所示:

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
WHERE p.products_id in (
Select products_id from products_attributes pa #This will give you the ID forall bikes that have either red or brown in them
INNER JOIN products_options_values pov
ON pov.products_options_values_id = pa.options_values_id
INNER 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)

当然,您将无法将颜色作为结果的一部分返回,因为颜色没有单一值。如果需要,您可以通过编写函数将颜色组合到一个字段中。

您在第三个选项中的选择是在您的 PHP 代码中汇总数据(在您的结果集中多次返回项目,但循环并只显示每个项目一次),然后显示返回的颜色列表以不同的方式(作为附加表格或逗号分隔列表或任何适合您的方式。

如果您将 OR 设为 AND,那当然意味着所有自行车都是红色和棕色的。如果这是您正在寻找的东西,这将是正确的,但听起来您想要两者之一,而不是两者。

关于sql - 具有大量连接的高级 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3005416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com