Mysql乘以计数

时间:2011-05-03 11:04:49

标签: mysql count multiplying

我有一个查询,它将遍历一个订单表,作为一个子查询,还会使用外键计算另一个表中的行数。

SELECT eo.*, (
    SELECT COUNT(*)
    FROM ecom_order_items eoi
    WHERE eo.eo_id = eoi.eoi_parentid
    AND eoi.site_id = '1'
) AS num_prods
FROM ecom_orders eo
WHERE eo.site_id = '1' AND eo_username = 'testuser'

现在,在ecom_order_items表上,它有一个eoi_quantity字段。我希望查询显示每个订单的产品数量,同时考虑数量字段。

SELECT eo.*, (
    SELECT COUNT(*) * eoi.eoi_quantity
    FROM ecom_order_items eoi
    WHERE eo.eo_id = eoi.eoi_parentid
    AND eoi.site_id = '1'
) AS num_prods
FROM ecom_orders eo
WHERE eo.site_id = '1' AND eo_username = 'testuser'

然而,当我尝试这个时,它只是给我与以前相同的数字。对于我正在测试的订单,它有2个项目,一个数量为1,另一个数量为10,num_prod在两个查询中返回为2。

有什么想法吗? :)

2 个答案:

答案 0 :(得分:1)

将查询重写为:

SELECT eo.*, sum(eoi.eoi_quantity) as sales
FROM ecom_orders eo
INNER JOIN ecom_order_items eoi ON (eo.eo_id = eoi.eoi_parentid)
WHERE eo.site_id = '1' AND eoi.site_id = '1' AND eo_username = 'testuser'
GROUP BY eo.eo_id;

由于每个项目的计数(*)为1,count(*) * quantitysum(quantity)相同。

答案 1 :(得分:1)

如果eoi.eoi_quantity的值由多个值1和10组成,则只选择其中一个值并乘以COUNT(*)。所以你得到的结果是1 * 2.

对于两个项目,COUNT(*)= 2,您想要结果2 * 1 + 2 * 10吗?这对我来说似乎不对。我想你要计算所有相关订单的总数量,那么为什么不使用SUM(eoi.eoi_quantity)获得1 + 10呢?因此,您将拥有:

SELECT eo.*, (
    SELECT SUM(eoi.eoi_quantity)
    FROM ecom_order_items eoi
    WHERE eo.eo_id = eoi.eoi_parentid AND eoi.site_id = '1'
) AS num_prods
FROM ecom_orders eo
WHERE eo.site_id = '1' AND eo_username = 'testuser';

但是这仍然会为每列提供相同的值。实际上,如果返回多行,则像(SELECT eo。*,...)这样的子查询将导致错误。

这就是约翰建议你想加入这些表格的原因。您需要连接表以确保行已正确链接,然后按照每行所需的ID对它们进行分组。怎么样:

SELECT eo.*, SUM(eoi.eoi_quantity)
FROM ecom_orders eo JOIN ecom_order_items eoi ON eo.eo_id = eoi.eoi_parentid
WHERE eo.site_id = '1' 
AND eo_username = 'testuser'
GROUP BY eo.eo_id;