如何避免分明

时间:2012-04-27 08:45:12

标签: mysql sql distinct

我有一个查询,当我使用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 )

2 个答案:

答案 0 :(得分:1)

如果订单可以与多个事件或具有多次事件的用户相关联,则可以将同一订单多次与同一用户相关联。在这种情况下,使用DISTINCT将仅为每个用户计算一次该订单,而省略它将对与用户的每次关联计算一次该订单。

如果你追求前者,那么你现有的查询是最好的选择。

答案 1 :(得分:1)

您没有从用户表和事件表中获取任何内容,因此为什么要加入它们。您的上一个“OR”子句明确引用它具有user_ID列。我希望你的订单表有一个关于下订单的用户ID的索引,然后你可以做

select
      user_id,
      count(*) as Orders
   from
      orders
   group by
      user_id