【发布时间】:2015-06-25 16:48:55
【问题描述】:
我尝试编写一个查询,为每个用户返回他做了多少订单以及在多少家不同的商店:
SELECT user_id,display_name,count(store_id) as stores,count(order_id) as orders
FROM `orders` natural join users
where user_id NOT IN (7,766,79)
group by user_id
order by orders desc
在我看来,这个查询应该这样做,但由于某种原因,我在 order 和 stores 列中得到相同的值(并且我已经仔细检查过是否应该存在差异)。任何人都可以帮忙吗?
顺便说一句,order_id 是主键,store_id 和 user_id 是订单的外键。
编辑:
SELECT user_id,display_name,count(distinct store_id) as stores,count(order_id) as orders
FROM `orders` natural join users
where user_id NOT IN (7,766,79)
group by user_id
order by orders desc
成功了,谁能解释一下为什么在这种情况下我必须添加不同的关键字?
已解决:
使用 @McAdam331 的 cmets 我了解到原始查询对两个计数中具有相同用户 ID 的行进行计数,并且由于 post_ids 是唯一的,因此唯一 ID 计数与行计数相同,而 store_id 可以有双倍没有与行数相同的计数。因此使用 distinct 解决了这个问题。
【问题讨论】:
-
尝试不带“display_name”字段的查询。我要做的是在没有 display_name 的情况下运行它,然后获取该查询的结果并将这些结果与同一个表连接起来,以将 display_name 重新添加到结果中。不如您尝试做的那样有效,但这应该可以解决正确的计数。
-
@mba12 我理解您的担忧,在大多数情况下确实如此,但如果
user_id是主键并且每个用户只有一个显示名称,则此查询将正常工作。 -
@mba12 我现在编辑为时已晚,但你说得对,如果 user_id 和 display_name 之间不是一对一的,它们不应该像这样分组,我想再次强调OP,因为我之前弄错了哈哈。