我有一个查询,当我使用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 )
最佳答案 您没有从用户表和事件表中获取任何内容,因此为什么要加入它们.您的上一个“OR”子句明确引用它具有user_ID列.我希望你的订单表有一个关于下订单的用户ID的索引,那么你可以这样做
select
user_id,
count(*) as Orders
from
orders
group by
user_id