我有一个查询,它将循环遍历订单表,并且作为子查询,还将使用外键计算另一个表中的行数。
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。
有什么想法吗? :)
最佳答案
如果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.*,...) 这样的子查询如果返回多于一行,将会导致错误。
这就是 Johan 建议您加入这些 table 的原因。您需要连接表以确保行正确链接,然后按您想要的每行 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;
关于Mysql 乘法计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5868497/