我尝试编写一个查询,让每个用户返回他做了多少订单以及有多少不同的商店:
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解决了这个问题。
答案 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
,因为您可能会从同一商店获得多个订单。