【问题标题】:SQL Query doesnt get correct countSQL 查询没有得到正确的计数
【发布时间】: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,因为我之前弄错了哈哈。

标签: mysql sql


【解决方案1】:

我只会使用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_ids 的数量。

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

【讨论】:

  • 添加不同的关键字有帮助,但为什么我必须添加呢?
  • 因为这样想,每一行都有一个order_id,和一个store_id。如果计算它们,它们的数量相同,因为它们的行数相同。您的第一个示例所做的是计算 store_ids 的总数(意味着每次出现时都会计算 store one),而我的会计算 store_ids 的不同数量(store one 只会计算一次)。
【解决方案2】:

你把它弄反了。从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;

请注意DISTINCTstore_count 中的使用,因为您可能有来自同一家商店的多个订单。

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多