繁体   English   中英

使用 INNER JOIN 和 distinct/group by 时数量列的总和

[英]SUM of a quantity column when using INNER JOIN and distinct/group by

我有这个 MySQL 查询:

    SELECT DISTINCT( rentals.order_item_id ), reserved_date, product_id, quantity, order_id FROM `test_rentals` as rentals
    INNER JOIN `test_orderitemmeta` as orderitemmeta
    WHERE `reserved_date` = '2020-07-07'
    AND `product_id` = 109
    AND orderitemmeta.meta_key = 'returned'
    AND orderitemmeta.meta_value = 'yes'

这将返回:

order_item_id 保留日期 产品编号 数量 order_id
134 2020-07-07 109 1个 274
138 2020-07-07 109 1个 276

test_orderitemmeta表包含一个唯一的meta_idorder_item_idmeta_keymeta_value ,可以有多行具有相同的 order_item_id , rentals 表只有order_item_id列来加入这些。

我希望返回单行显示保留日期、产品 ID 和总数量,我想我可以通过使用SUM( quantity )来做到这一点,但这给出了结果:

order_item_id 保留日期 产品编号 SUM(数量) order_id
134 2020-07-07 109 16 274

我认为这是在使用DISTINCT之前可用的总行数?

我还考虑过删除DISTINCT( rentals.order_item_id )并在查询末尾使用GROUP BY rentals.order_item_id但这也没有给出我正在寻找的结果。

我怎样才能得到这样的总数量的单行结果:

保留日期 产品编号 数量
2020-07-07 109 2个

我认为这将为您提供所需的结果:

SELECT reserved_date, product_id, SUM(quantity) as quantity
FROM `test_rentals` as rentals, `test_orderitemmeta` as orderitemmeta
WHERE `reserved_date` = '2020-07-07'
    AND `product_id` = 109
    AND orderitemmeta.meta_key = 'returned'
    AND orderitemmeta.meta_value = 'yes'
GROUP BY reserved_date, product_id

DISTINCT不是 function,它是SELECT子句的修饰符,适用于整行(否则没有意义)。 它在这里没有帮助。

没有条件的JOIN ( ON... ) 生成第一个表中的行与第二个表中的行的所有组合。 您需要一个条件来仅组合两个表中的相关行(即属于所需租金的元数据行)。

假设表test_orderitemmeta包含一个名为rental_id的列,它将元数据记录链接到拥有元数据的租赁记录,生成您期望的结果的查询如下所示:

SELECT r.reserved_date, r.product_id, SUM(r.quantity) AS quantity
FROM test_rentals AS r
INNER JOIN test_orderitemmeta AS m ON r.rental_id = m.rental_id
WHERE r.reserved_date = '2020-07-07'
  AND r.product_id = 109
  AND m.meta_key = 'returned'
  AND m.meta_value = 'yes'
GROUP BY r.product_id, r.reserved_date 

rental_id替换为表中的正确列名。

您将尝试使用此代码获取所需的结果:

    SELECT rentals.*, orderitemmeta.reserved_date, orderitemmeta.product_id, SUM(orderitemmeta.quantity) as quantity
    FROM `test_rentals` as rentals JOIN test_orderitemmeta as orderitemmeta on orderitemmeta.product_id = rentals.order_item_id 
WHERE orderitemmeta.reserved_date = '2020-07-07'
        AND orderitemmeta.product_id = 109
        AND orderitemmeta.meta_key = 'returned'
        AND orderitemmeta.meta_value = 'yes'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM