【问题标题】:MySQL Counting different items in one queryMySQL在一个查询中计算不同的项目
【发布时间】:2013-12-20 03:23:37
【问题描述】:

假设这是我的数据库表: id、client_id、order_name

每一个翻倍的订单都在创造新的记录。例如:

1, 1, super-glue
2, 1, super-glue
3, 1, plastic wallet

我如何在单个查询中找到客户订购了多少不同的商品?

所以在这种情况下它会返回 2。

我知道我必须使用SELECT {something in here} WHERE client_id = 1,但我不确定如何计算不同的项目。

【问题讨论】:

  • 为什么是 2 而不是 1?请多解释
  • 因为买了两件不同名字的东西。

标签: mysql select count where items


【解决方案1】:

将 COUNT 与 DISTINCT order_name 一起使用:

SELECT COUNT(DISTINCT order_name)
FROM yourTable
WHERE client_id = 1

【讨论】:

  • 这个查询会返回什么?第一个或第二个记录
  • 哦,好的,我明白了。现在我明白了用户想要什么。
  • 这将返回 2,而不是记录。 OP要求一种计算它们的方法。这将告诉您“DISTINCT”订单名称的数量,即 2
【解决方案2】:

只计算一个客户可以使用的不同项目

SELECT COUNT(DISTINCT order_name)
FROM orders
WHERE client_id=1;

如果您想要每个客户的汇总计数,您可以使用 group by 表达式:

SELECT client_id, COUNT(DISTINCT order_name)
FROM orders
GROUP BY client_id;

如果您想要每个客户和订单名称的最新行,您可以使用子查询:

SELECT id, client_id, order_name
FROM
(
  SELECT max(id) AS id
  FROM orders
  GROUP BY client_id, order_name
) single_orders
INNER JOIN orders ON single_orders.id = orders.id
ORDER BY client_id, order_name;

这将为每个不同的客户订单组合选择最大 id,然后获取相应的行数据。

最后,在 MySQL 中,您还可以获得任何客户订购的不同商品的逗号分隔列表:

SELECT client_id, group_concat(DISTINCT order_name ORDER BY order_name)
FROM orders
GROUP BY client_id
ORDER BY client_id;

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多