SQL查询没有得到正确的计数

时间:2015-06-25 16:48:56

标签: mysql sql

我尝试编写一个查询,让每个用户返回他做了多少订单以及有多少不同的商店:

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

在我看来,这个查询应该这样做,但由于某种原因,我在订单和存储列中获得相同的值(我已经仔细检查过应该存在差异)。任何人都可以帮忙吗?

BTW,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的注释我理解原始查询计算两个计数中具有相同用户ID的行,并且因为post_id是唯一的,所以唯一ID计数与行计数相同,而store_id可以有两倍没有与行数相同的计数。因此使用distinct解决了这个问题。

2 个答案:

答案 0 :(得分:2)

我只会使用<br />来获取订单数量,而使用COUNT(*)来获取商店数量:

COUNT(DISTINCT store_id)

您的查询失败的原因是因为您在store_id上​​省略了SELECT u.user_id, u.display_name, COUNT(*) AS numOrders, COUNT(DISTINCT store_id) AS numStores FROM orders o JOIN users u ... 。因为对于每一行,您都有store_id和order_id,每组中的store_id和order_id数量相同。但是,这不是您真正想要的,您正在寻找DISTINCT store_ids的数量。

如果用户可能两次使用相同的order_id(尽管对我来说没有意义),您也可以在该计数函数中添加DISTINCT关键字。

答案 1 :(得分:0)

你已经倒退了。从users开始,加入orders。像这样:

SELECT users.user_id, display_name,
count(DISTINCT store_id) as store_count,
count(order_id) as order_count
FROM users
LEFT OUTER JOIN orders ON orders.user_id=users.user_id
where users.user_id NOT IN (7,766,79) 
group by users.user_id 
order by order_count desc;

请注意在DISTINCT中使用store_count,因为您可能会从同一商店获得多个订单。