如何避免明显

Ori*_*sky 7 mysql sql distinct

我有一个在使用 DISTINCT 时有效的查询。不过,我有一种感觉,我可以以一种可以帮助我避免使用 DISTINCT 的方式重写查询,这将使数据库更容易(更快)地处理查询。

\n\n

如果没有必要重写查询,请解释一下,如果有的话,请查看简化的查询并给我一个提示如何重新编写它,这样我一开始就不会得到重复项。

\n\n
SELECT\xc2\xa0Us.user_id,\xc2\xa0COUNT(\xc2\xa0DISTINCT\xc2\xa0Or.order_id\xc2\xa0)\xc2\xa0AS\xc2\xa0orders\nFROM\xc2\xa0users\xc2\xa0AS\xc2\xa0Us\nLEFT\xc2\xa0JOIN\xc2\xa0events\xc2\xa0AS\xc2\xa0Ev\xc2\xa0ON\xc2\xa0Ev.user_id\xc2\xa0=\xc2\xa0Us.user_id\nLEFT\xc2\xa0JOIN\xc2\xa0orders\xc2\xa0AS\xc2\xa0Or\xc2\xa0ON\xc2\xa0Or.event_id\xc2\xa0=\xc2\xa0Ev.event_id\nOR\xc2\xa0Or.user_id = Us.user_id\nGROUP\xc2\xa0BY\xc2\xa0Us.user_id\n
Run Code Online (Sandbox Code Playgroud)\n\n

查询的简短描述:我有一个用户表,其中包含他们的事件和订单。有时订单具有 user_id 列,但大多数情况下它为空,并且它们必须通过事件表连接。

\n\n

编辑:

\n\n

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

\n\n
user_id orders\n3952    263\n3953    7\n3954    2\n3955    6\n3956    1\n3957    0\n...\n\nuser_id orders\n3952    79\n3953    7\n3954    2\n3955    6\n3956    1\n3957    0\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题已修复:

\n\n
SELECT COALESCE( Or.user_id, Ev.user_id ) AS user, COUNT( Or.order_id ) AS orders\nFROM orders AS Or\nLEFT JOIN events AS Ev ON Ev.event_id = Or.event_id\nGROUP BY COALESCE( Or.user_id, Ev.user_id )\n
Run Code Online (Sandbox Code Playgroud)\n

DRa*_*app 1

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

select
      user_id,
      count(*) as Orders
   from
      orders
   group by
      user_id
Run Code Online (Sandbox Code Playgroud)