我有一个查询,它将遍历一个订单表,作为一个子查询,还会使用外键计算另一个表中的行数。
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。
有什么想法吗? :)
答案 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(*) * quantity
与sum(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;