【问题标题】:SUM of a quantity column when using INNER JOIN and distinct/group by使用 INNER JOIN 和 distinct/group by 时数量列的 SUM
【发布时间】:2020-12-22 09:47:58
【问题描述】:

我有这个 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 reserved_date product_id quantity 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 列来加入这些与。

我希望返回单行显示 reserved_date、product_id 和总量,我想我可以使用 SUM( quantity ) 来做到这一点,但这给出了结果:

order_item_id reserved_date product_id SUM(quantity) order_id
134 2020-07-07 109 16 274

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

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

我怎样才能使结果成为单行,总数量如下:

reserved_date product_id quantity
2020-07-07 109 2

【问题讨论】:

标签: mysql


【解决方案1】:

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

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

【讨论】:

  • 不 - 列的一切都很好,但数量是 16(我认为这是因为每个 order_item_id 有 8 行 test_orderitemmeta)
  • @bigdaveygeorge INNER JOIN 子句中应该有一个条件来仅过滤属于所需租赁的元数据。您没有在问题中发布的查询中指定任何相关内容。
  • @axiac 我也看到了这个问题,但我决定把它留在问题中。也许他有原因,我不知道。
【解决方案2】:

DISTINCT 不是函数,它是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 替换为表中正确的列名。

【讨论】:

  • test_orderitemmeta表包含唯一的meta_id、order_item_id、meta_key和meta_value,可以有多行同一个order_item_id,rentals表只有order_item_id列来连接它们
  • 你知道为什么这个问题被否决了吗?因为它不包含需要回答的信息。您在 cmets 中到处写的所有这些文章都应该在问题中。连同查询中涉及的两个表的定义。
【解决方案3】:

你会尝试这段代码得到你需要的结果:

    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'

【讨论】:

    猜你喜欢
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    相关资源
    最近更新 更多