sql distinct在联接中不工作,不断获取重复项我该怎么解决这个问题?

gt0wga4j  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(294)
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
gcuhipw9

gcuhipw91#

大概你想要:

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_updatesorders ,所以我改变了 left join 到一个 inner join .
我已将状态id从 group by ,因为它在不同的行上是不同的。
你的多重结果大概是因为 order_updates.id 用于 group by . 我不明白你的意图,也不完全了解数据结构,所以我不知道为什么这是必要的。我可以说,如果你想每一个订单一行,那么我希望 orders.id 在这个世界上 group by .

yqhsw0fo

yqhsw0fo2#

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

有一个独特的和一个小组通常不是一个好主意,如果有的话。
在许多rdbms中不允许使用部分分组by(不包括所有非聚合字段),在最近的mysql版本中默认配置为禁用。如果有一个以上的值
order_updates.order_id date ,或 status_id 同样的道理 order_updates.id ,则可以有效地随机选择这些字段遇到的值。

pb3skfrl

pb3skfrl3#

根据您的预期输出,您可以尝试以下方法:

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

相关问题