我尝试编写一个查询,为每个用户返回他下了多少订单以及在多少家不同的商店:
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_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_ids 是唯一的,唯一 ID 计数与行计数相同,而 store_id 可以有双倍与行计数不相同。因此使用 distinct 解决了这个问题。
最佳答案
我只使用 COUNT(*)
获取订单数量,使用 COUNT(DISTINCT 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 上省略了 DISTINCT
。因为每一行都有一个 store_id 和一个 order_id,所以每个组中都有相同数量的 store_id 和 order_id。但是,这并不是您真正要查找的内容,您要查找的是 DISTINCT
store_id 的数量。
如果用户有可能两次使用相同的 order_id(虽然这对我来说没有意义),您也可以在该计数函数中添加 DISTINCT 关键字。
关于mysql - SQL 查询没有得到正确的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056207/