2009-12-14 44 views
0

在那里,如何缩短这个MySQL查询?

是否有反正缩短这个MySQL查询的所有?它需要根据价格规则从名为RuleValue的列中的PriceRuleDetail表中获取两个不同的行,但使用别名将它们返回到同一行中。它使用select语句内的子查询,我认为这是正确的,但可能有更简单的方法?

下面确实工作正常,我很满意它,但我想知道是否有一种方法使这个更短?

SELECT Stock.*, 
    (SELECT PriceRuleDetail.RuleValue 
    FROM PriceRuleDetail 
    WHERE PriceRuleDetail.Sku = Stock.Sku 
    AND PriceRuleDetail.PriceRule = 'RG' 
    AND PriceRuleDetail.Quantity = 1) as Price, 
    (SELECT PriceRuleDetail.RuleValue 
    FROM PriceRuleDetail 
    WHERE PriceRuleDetail.Sku = Stock.Sku 
    AND PriceRuleDetail.PriceRule = 'RRP' 
    AND PriceRuleDetail.Quantity = 1) as WasPrice 
FROM Stock, StockCategoryMemberList 
WHERE StockCategoryMemberList.Sku = Stock.Sku 
AND StockCategoryMemberList.CategoryCode = 'FIRE' 

在此先感谢。

安迪

回答

4

您可以使用左连接来完成这个

SELECT Stock.*, 
     PRD1.RuleValue as Price, 
     PRD2.RuleValue as WasPrice 
FROM 
    Stock INNER JOIN 
    StockCategoryMemberList ON StockCategoryMemberList.Sku = Stock.Sku LEFT JOIN 
    PriceRuleDetail PRD1 ON PRD1.Sku = Stock.Sku 
         AND PRD1.PriceRule = 'RG' 
         AND PRD1.Quantity = 1 LEFT JOIN 
    PriceRuleDetail PRD2 ON PRD2.Sku = Stock.Sku 
         AND PRD2.PriceRule = 'RRP' 
         AND PRD2.Quantity = 1 
WHERE StockCategoryMemberList.CategoryCode = 'FIRE' 
+0

的情况下,我发现这是所有答案中最快的,并且当然是最具可读性的。 非常感谢您的帮助! – Schodemeiss 2009-12-14 13:10:59

+0

你已经更快了......我的文本编辑器中有相同的请求。 – Arno 2009-12-14 13:11:05

6

使它成为一个单一的查询,以联接:

SELECT 
    Stock.*, 
    PRD1.RuleValue as Price, 
    PRD2.RuleValue as WasPrice 
FROM 
    Stock, 
    StockCategoryMemberList, 
    PriceRuleDetail PRD1, 
    PriceRuleDetail PRD2 
WHERE 
StockCategoryMemberList.Sku = Stock.Sku 
AND StockCategoryMemberList.CategoryCode = 'FIRE' 
AND PRD1.Sku = Stock.Sku 
    AND PRD1.PriceRule = 'RG' 
    AND PRD1.Quantity = 1 
AND 
    PRD2.Sku = Stock.Sku 
    AND PRD2.PriceRule = 'RRP' 
    AND PRD2.Quantity = 1 

我让你做同样的假设(即对一只股票的记录,只有一个价格,只有一个WasPrice)。如果不是这样的话......查询不会好的。也不是你的。

+0

这实际上延长了查询的行数,但我认为这是一个更具可读性的查询。 – antik 2009-12-14 12:57:16

+0

谢谢! 由于唯一的按键设置和“数量= 1声明”(因为可以为频段设置不同的数量,因此可能存在不同的价格),PriceRuleDetail表格中只能有一个Price和One是价格记录。 这看起来比我的好多了! 谢谢! – Schodemeiss 2009-12-14 12:59:53

+0

如果没有WasPrice(或Price),则不会返回特定的库存。 – 2009-12-14 13:02:13

0

我会建议实际上延长它,而不是使用Stock。*,但使用每个列名称。当您使用*时,它必须查询表以获取列名称,并稍微慢一点。

2
select s.*, prd1.rulevalue as price, prd2.rulevalue as wasprice 
from 
    stock s 
    inner join stockcategorymemberlist scm 
     on s.sku = scm.sku 
    inner join priceruledetail prd1 
     on prd1.sku = s.sku and prd1.pricerule='RG' and prd1.quantity=1 
    inner join priceruledetail prd2 
     on prd2.sku = s.sku and prd2.pricerule='RRP' and prd2.quantity=1 
where 
    s.categorycode='FIRE' 

这也将更快,你就不必执行每个子选择的对表中的每一行。