2012-02-22 89 views
2
SELECT shop.price,shop.item,shop.full_item_name,shop.qty,shop.shop_id, 
SUM(averages_20128.combined_prices + averages_20127.combined_prices) AS combined, 
SUM(averages_20128.total_sales + averages_20127.total_sales) AS total 
FROM `shop` 
JOIN `averages_20128` 
ON averages_20128.full_item_name=shop.full_item_name 
JOIN `averages_20127` 
ON averages_20128.full_item_name=averages_20127.full_item_name 
JOIN `theShops` 
ON theShops.id=shop.shop_id 
WHERE shop.price<combined/total 
AND theShops.open='1' 
AND shop.id!='' 
AND `total`>10 
ORDER BY combined/total DESC 
LIMIT 100 

错误:在未知列'合并“where子句”结合SUM和WHERE - 没有得到我期望的结果

概述:我已经考虑创建存储当前平均列和排序上但是,我刚开始时并没有这样做,现在已经有了数据。我宁愿不经过这一切并重新计算这一点。所以我希望MySQL能为我做数学。

当我遗漏了WHERE/ORDER子句时,这会起作用,导致我相信我的语法有问题。

回答

0

正如其他人所说,它不起作用,因为combinedwhere子句中不可用。

执行的顺序是在SQL如下:

FROM clause 
WHERE clause 
GROUP BY clause 
HAVING clause 
SELECT clause 
ORDER BY clause 

让你在select定义名称中不提供where - 也喜欢聚集仅提供Group By执行后sum

我什么猜测你想要实际上是这样的

SELECT shop.price,shop.item,shop.full_item_name,shop.qty,shop.shop_id, 
combined, total 
FROM `shop` 
JOIN (
    SELECT averages_20128.full_item_name, 
    SUM(averages_20128.combined_prices + averages_20127.combined_prices) AS combined, 
     SUM(averages_20128.total_sales + averages_20127.total_sales) AS total 
    FROM `averages_20127` JOIN averages_20128 
     ON averages_20128.full_item_name=averages_20127.full_item_name 
    GROUP BY averages_20128.full_item_name 
) AS averages 
ON averages.full_item_name=shop.full_item_name 
JOIN `theShops` 
ON theShops.id=shop.shop_id 
WHERE shop.price<combined/total 
AND theShops.open='1' 
AND shop.id!='' 
AND `total`>10 
ORDER BY combined/total DESC 
LIMIT 100 

totalcombined值计算的分选,然后与当前店铺的价格进行比较。

再次,它不完全清楚你想要做什么,所以这可能不是你所需要的。

+0

你先生,是个绅士和学者,今天想到了我很多!谢谢! – 2012-02-22 19:44:43

+0

我将阐明我将ORDER BY更改为:ORDER BY shop.price-(combined/total)ASC ...因此,基本上它试图将商品销售低于平均水平的商店,然后再订购最高的节省。 – 2012-02-22 20:07:23

0

combined/total使用来自结果集的列而不是原始数据。

为了像这样引用它们,您需要重新创建它们的计算,或使用子查询来执行该计算,然后在外部查询中进行筛选和排序。

0

要使用SUM您需要有一个GROUP BY的地方。

+0

也是如此,虽然我认为这将是他得到的下一个错误信息,而不是现在的。 – 2012-02-22 18:33:12

+0

如果我运行这个,MySQL不会返回任何错误:SELECT shop.price,shop.item,shop.full_item_name,shop.qty,shop.shop_id, SUM(averages_20128.combined_prices + averages_20127.combined_prices)AS合并, SUM(averages_20128 .total_sales + averages_20127。TOTAL_SALES)从总 'shop' JOIN'averages_20128' ON averages_20128.full_item_name = shop.full_item_name JOIN'averages_20127' ON averages_20128.full_item_name = averages_20127.full_item_name JOIN'theShops' ON theShops.id =店。 shop_id – 2012-02-22 18:45:20

1

变化:

WHERE shop.price < combined/total 

要:

WHERE shop.price < 
    SUM(averages_20128.combined_prices + averages_20127.combined_prices)/total 

或将其移动到HAVING条款:

HAVING shop.price < combined/total 

WHERESUM()之前应用,因此总列不可到它呢。 HAVING几乎发生在最后。