Ori*_*sky 7 mysql sql distinct
我有一个在使用 DISTINCT 时有效的查询。不过,我有一种感觉,我可以以一种可以帮助我避免使用 DISTINCT 的方式重写查询,这将使数据库更容易(更快)地处理查询。
\n\n如果没有必要重写查询,请解释一下,如果有的话,请查看简化的查询并给我一个提示如何重新编写它,这样我一开始就不会得到重复项。
\n\nSELECT\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\nRun Code Online (Sandbox Code Playgroud)\n\n查询的简短描述:我有一个用户表,其中包含他们的事件和订单。有时订单具有 user_id 列,但大多数情况下它为空,并且它们必须通过事件表连接。
\n\n编辑:
\n\n这些是我编写的简化查询的结果,首先没有不同,然后包含不同。
\n\nuser_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...\nRun Code Online (Sandbox Code Playgroud)\n\n问题已修复:
\n\nSELECT 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 )\nRun Code Online (Sandbox Code Playgroud)\n
您没有从用户表或事件表中获取任何内容,那么为什么要加入它们呢?您的最后一个“OR”子句明确引用它有一个 user_ID 列。我希望你的订单表有一个关于下订单的用户 ID 的索引,那么你可以这样做
select
user_id,
count(*) as Orders
from
orders
group by
user_id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5477 次 |
| 最近记录: |