mysql - 使用嵌套子查询优化 mysql 查询

标签 mysql sql subquery

长话短说,我有一些稍微复杂的查询(参见下面的示例)并且需要将它们的结果保存到一个表中而不是每次都运行它们。我有大约 6 个月的 MYSQL 经验,所以我知道的足以让自己陷入困境。

背景:每个产品都有多个规则来确定定价、运输等。kitruleoptions 表将每个规则连接到它将应用的下拉选项——因此,如果客户选择“添加可选 X”,则与 Xs 有关的规则得到应用。选项集表将每个 ProductItemID 连接到与其关联的下拉选项。因此,仅当在该规则的下拉选项集中找到所有产品项的下拉选项时,规则才应适用于特定产品项。换句话说,并不是每次选择 X 时都必须应用该规则,而是每次在下拉列表 A 中选择 X 并且在下拉列表 B 中选择 Y 或 Z 时应用它,但如果在下拉列表中选择 W 则不适用B、

这是一个示例查询,它为我获取单个 ProductItemID 的总价。

SELECT ProductItemID, SUM(RulePrice * ItemQuantity) AS Price FROM 
(SELECT RuleGroups, ProductItemGroups, RulePrice, ItemQuantity, productitems.ProductItemID
FROM kitrules
LEFT JOIN productitems ON productitems.ProductID = kitrules.ProductID
LEFT JOIN (SELECT RuleID, GROUP_CONCAT(OptionGroupID ORDER BY OptionGroupID) AS RuleGroups 
    FROM kitruleoptions
    WHERE OptionGroupID IN (SELECT OptionGroupID FROM optionsets WHERE ProductItemID = %s)
    GROUP BY RuleID) AS k ON k.RuleID = kitrules.RuleID
LEFT JOIN (SELECT ProductItemID, GROUP_CONCAT(OptionGroupID ORDER BY OptionGroupID) AS ProductItemGroups
    FROM optionsets
    GROUP BY ProductItemID) AS o ON o.ProductItemID = productitems.ProductItemID
WHERE productitems.ProductItemID = %s AND RuleGroups = ProductItemGroups) AS x
GROUP BY x.ProductItemID

目前,这个选择(或者更确切地说,一个更复杂的选择不仅仅是价格)进入一个 INSERT INTO 语句,有点像这样:

INSERT INTO pricelists (ProductItemID, Price) 
SELECT [the query above] 
WHERE ProductItemID = %s

我正在尝试制定它,而不是像这样:

INSERT INTO pricelists (ProductItemID, Price)
SELECT [a new query that only requires ProductID]
WHERE ProductItemID IN (SELECT ProductItemID FROM productitems WHERE ProductID = %s)

... 只需要输入ProductID,即可一次更新整个产品。这样,我将不再需要循环遍历 PHP 数组来执行此操作。在kitrules 表和productitems 表中都找到了ProductID,所以我觉得应该有办法,但我好像找不到。所以我的问题是,如何将查询重新表述为只需要 ProductID?有可能吗?有没有办法在没有 GROUP_CONCAT 的情况下直接比较选项集集和 kitruleoptions 集?另外,我将如何使用触发器设置它,它应该触发什么?我以前从未做过触发器。

编辑:这是我的 SQL Fiddle其中有一个简单的例子说明表格应该如何结束。我的想法是,我从一个设置开始,每个产品只有一个或多个项目,但后来由于需求的后期变化(是的),我不得不添加生成套件项目或组合项目的能力多个不同的项目,但工具包本身就是项目。要求是套件的 ItemCost 是其包含的项目的 ItemCosts 的总和,套件的价格是其包含的规则的 RulePrices 乘以 ItemQuantity 的总和,并且其运费由其包含的项目的运输信息的组合运输确定,但除此之外,套件只是另一件元素。提示三周的头痛和计数。

最佳答案

我终于明白了:

SELECT ProductItemID, SUM(RulePrice * ItemQuantity) AS TotalPrice FROM
(SELECT p.ProductItemID, k.RuleID, p_count, COUNT(k.RuleID) AS k_count,
RulePrice, ItemQuantity
FROM productitems
INNER JOIN optionsets o ON productitems.ProductItemID = o.ProductItemID
INNER JOIN (SELECT ProductItemID, COUNT(OptionGroupID) AS p_count 
        FROM optionsets
        GROUP BY ProductItemID) AS p ON p.ProductItemID = o.ProductItemID
LEFT JOIN kitruleoptions k ON k.OptionGroupID = o.OptionGroupID
LEFT JOIN kitrules ON k.RuleID = kitrules.RuleID
WHERE productitems.ProductID = %s
GROUP BY o.ProductItemID, k.RuleID
HAVING k_count = p_count) AS x
GROUP BY x.ProductItemID

关于mysql - 使用嵌套子查询优化 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645408/

相关文章:

php - PHP GET 方法中的多个请求

java - 并发多线程批量向Mysql插入/更新数据

java - 插入后同步 hibernate 的 session

c# - 从 RESTORE LABELONLY 操作中检索值

sql - 什么是 SSIS 包部署和更改跟踪最佳实践?

php - 从多个类别获取主题并显示前十个主题以及 mysql/php 中的响应

php - MySQL查找行

mysql - Grafana世界地图面板: latitude and longitude in mysql cannot display points on map

mysql - 将子查询结果合并为文本

mysql - 使用子查询和可能的连接来获取人口百分比