SQL DISTINCT在联接中不起作用,请保持重复。我该如何解决?

时间:2018-10-19 19:04:13

标签: mysql sql

SELECT DISTINCT order_updates.order_id as 'order', date, 
sum(products.price*amount), status_id 
FROM order_updates 
LEFT JOIN orders ON orders.id=order_updates.order_id 
JOIN order_items ON orders.id = order_items.order_id 
JOIN products ON products.id = order_items.id 
GROUP by order_updates.id  
ORDER BY order_updates.status_id  ASC

上面是我使用的SQL代码。但是我一直在重复。 为什么会这样?

order | date              | sum(products.price*amount | status_id
------------------------------------------------------------------
1     |2018-10-15 17:45:41|46.80000114440918          |1
2     |2018-10-15 17:45:41|21.800000190734863         |1
1     |2018-10-15 17:45:41|46.80000114440918          |3

我希望此输出:

order | date              | sum(products.price*amount | status_id
------------------------------------------------------------------
2     |2018-10-15 17:45:41|21.800000190734863         |1
1     |2018-10-15 17:45:41|46.80000114440918          |3

3 个答案:

答案 0 :(得分:3)

这些都不是重复的; DISTINCT覆盖了整行。示例中的第一行和第三行具有不同的status_id值。

  • 拥有DISTINCT和GROUP BY通常不是一个好主意。
  • 在许多RDBMS中,不允许
  • 部分GROUP BY(不覆盖所有非聚合字段),并且在最近的MySQL版本中默认将其配置为禁用。如果order_updates.order_id date中的任何一个或同一个status_id的{​​{1}}中有多个值,那么您将有效地随机选择这些值遇到的值字段。

答案 1 :(得分:1)

根据您的预期输出,您可以尝试以下操作:

Select order, date, tot,max(status_id)
from 
(SELECT DISTINCT order_updates.order_id as 'order', date, 
sum(products.price*amount) as tot, status_id 
FROM order_updates 
LEFT JOIN orders ON orders.id=order_updates.order_id 
JOIN order_items ON orders.id = order_items.order_id 
JOIN products ON products.id = order_items.id 
GROUP by order_updates.id  
ORDER BY order_updates.status_id  ASC
)a
group by order,date, tot

答案 2 :(得分:0)

大概是您想要的:

SELECT o.order_id, o.date, max(status_id),
       sum(p.price * oi.amount)
FROM order_updates ou JOIN
     orders o
     ON o.id = ou.order_id JOIN
     order_items oi
     ON o.id = oi.order_id JOIN
     products p
     ON p.id = oi.id 
GROUP by o.id, o.date 
ORDER BY ou.status_id ASC;

注意:

  • SELECT中所有未聚合的列都在GROUP BY中。
  • 查询使用表别名,因此更易于写入和读取。
  • 我假设order_updates中的所有顺序都在orders中,所以我将left join更改为inner join
  • 我从group by中删除了状态ID,因为在不同的行上它是不同的。

大概,您的多个结果是由于order_updates.id中使用了group by。我不了解您的意图,也不了解数据结构,所以我不知道为什么这样做是必要的。我可以说,如果您希望每个订单一行,那么我希望orders.id位于group by中。