6

我有一个在使用 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,但大多数情况下它是空的,它们必须通过事件表连接。

编辑:

这些是我编写的简化查询的结果,首先没有 distinct,然后包括 distinct。

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 )
4

2 回答 2

1

如果一个订单可以与多个事件关联,或者一个用户与一个事件关联多次,那么同一个订单就有可能与同一个用户关联多次。在这种情况下, usingDISTINCT将只为每个用户计算一次该订单,而忽略它将为与用户的每个关联计算一次该订单。

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

于 2012-04-27T10:19:43.370 回答
1

您没有从用户表或事件表中得到任何东西,所以为什么要加入它们。您的最后一个“OR”子句明确引用它有一个 user_ID 列。我希望你的订单表有一个关于下订单的用户 ID 的索引,那么你可以这样做

select
      user_id,
      count(*) as Orders
   from
      orders
   group by
      user_id
于 2012-04-27T11:04:22.903 回答