【问题标题】:MySql sum DISTINCT after join加入后MySql和DISTINCT
【发布时间】:2021-10-30 21:58:26
【问题描述】:

我有 2 个连接在一起的表(Orders 和 Order_item) 当我使用连接时,我得到重复的记录,然后我用DISTINCT 消除它们,但是当我想得到总和时,shipping_price DISTINCT 不起作用,因为它只是消除了相同的价格值而且我所有的价格都是一样的得到 1 而不是总和!

如果我不使用 DISTINCT ,我会按顺序获取每个项目的行

SELECT   sum(DISTINCT shipping_price) FROM `product_order`
INNER JOIN `product_address`
ON `product_order`.`address_id` = `product_address`.`id`
INNER JOIN `product_item`
ON `product_order`.`id` = `product_item`.`order_id`
WHERE (`status`<>2) 
AND (`company_id`=1968)
AND DATE(date)='2021-08-31'
ORDER BY `product_order`.`id` DESC

如何正确获取运费总和..

order_table 中的数据是

id     shipping_price    status 
       100
       200
       200
       100

sum = 600 ,但是如何得到它,如果我没有 DISTINCT,我会得到超过一行的每个 order_items 加入订单的行数..

【问题讨论】:

  • 请提供示例数据和预期输出。
  • sum(distinct) 从来都不是正确的使用方法,除非您在 SQL 中演示不应该使用的东西。

标签: mysql


【解决方案1】:

使用子查询获取运费。像这样的:

    SELECT product_order.id, 
           SUM(product_item.price * product_item.quantity) shipping_price
      FROM product_order
      JOIN product_item ON product_order.id = product_item.order_id
     GROUP BY product_order.id 

这里的诀窍是获取一个子查询,该子查询每个订单只提供一行,其中包含总运费。在子查询中执行 SUM() ... GROUP BY ...`。这样您就可以避免任何重复的项目。

在继续确保它有效之前进行测试:提供每个订单 ID 及其运费。

然后把它当作一个表来使用,将它与其余部分连接起来。

SELECT   total.shipping_price,
         product_order.id,
         product_address.*
   FROM  product_order
   JOIN  product_address 
           ON product_order.id = product_address.order_id
   JOIN  (
        SELECT product_order.id, 
               SUM(product_item.price * product_item.quantity) shipping_price
          FROM product_order
          JOIN product_item ON product_order.id = product_item.order_id
         GROUP BY product_order.id 
         ) total ON product_order.id = total.id
  ORDER BY product_order.id = total.id

【讨论】:

  • 两个答案都是正确的,我标记第一个答案,并感谢您分享的详细信息非常感谢您
  • and ( select sum(shipping_price+post_tax+pack_price) FROM product_order and DATE(date)='2021-08-31' ) AS deductions",这是我的子查询,以及如何将日期传递给从上面的查询中,我按日期进行查询分组,并希望将日期传递给这个子查询。
  • 请提出另一个问题,而不是在评论中提出后续问题。
【解决方案2】:

使用子查询而不是连接。

SELECT (
    select sum(shipping_price) 
    FROM product_item 
    WHERE po.`id` = `product_item`.`order_id` 
) as shipping_price
FROM `product_order` po
INNER JOIN `product_address`
ON `product_order`.`address_id` = `product_address`.`id`
WHERE (`status`<>2) 
AND (`company_id`=1968)
AND DATE(date)='2021-08-31'
ORDER BY `product_order`.`id` DESC

【讨论】:

  • 谢谢你,我有一个问题:
  • "( select sum(shipping_price+post_tax+pack_price) FROM product_order and DATE(date)='2021-08-31' ) AS deductions",这是我的子查询,以及如何要将日期从上面的查询传递给这个,我按日期进行查询组,并希望将日期传递给这个子查询。
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2013-08-28
  • 2015-06-16
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多