我有一个查询,当我使用DISTINCT时。但是我有一种感觉,我可以用一种方式重写查询,这将有助于我避免使用DISTINCT,这将使数据库更容易(更快)处理查询。
如果重写查询没有意义,请解释一下,如果有,请查看简化查询并给我一个提示如何重新制定它,这样我就不会在第一时间获得重复。
SELECT Us.user_id, COUNT( DISTINCT Or.order_id ) AS orders
FROM users AS Us
LEFT JOIN events AS Ev ON Ev.user_id = Us.user_id
LEFT JOIN orders AS Or ON Or.event_id = Ev.event_id
OR Or.user_id = Us.user_id
GROUP BY Us.user_id
查询的简短描述:我有一个用户表,他们的事件和订单。有时订单有列user_id,但大部分都是null,它们必须通过事件表连接。
编辑:
这些是我编写的简化查询的结果,首先没有明确的,然后包括不同的。
user_id orders
3952 263
3953 7
3954 2
3955 6
3956 1
3957 0
...
user_id orders
3952 79
3953 7
3954 2
3955 6
3956 1
3957 0
...
问题已解决:
SELECT COALESCE( Or.user_id, Ev.user_id ) AS user, COUNT( Or.order_id ) AS orders
FROM orders AS Or
LEFT JOIN events AS Ev ON Ev.event_id = Or.event_id
GROUP BY COALESCE( Or.user_id, Ev.user_id )
答案 0 :(得分:1)
如果订单可以与多个事件或具有多次事件的用户相关联,则可以将同一订单多次与同一用户相关联。在这种情况下,使用DISTINCT
将仅为每个用户计算一次该订单,而省略它将对与用户的每次关联计算一次该订单。
如果你追求前者,那么你现有的查询是最好的选择。
答案 1 :(得分:1)
您没有从用户表和事件表中获取任何内容,因此为什么要加入它们。您的上一个“OR”子句明确引用它具有user_ID列。我希望你的订单表有一个关于下订单的用户ID的索引,然后你可以做
select
user_id,
count(*) as Orders
from
orders
group by
user_id