【问题标题】:Count repeating names in table计算表中的重复名称
【发布时间】:2013-01-18 00:01:00
【问题描述】:

我有两个表:Customer 和 ParkingTransaction。我想展示最常使用地段的前 10 位客户。 ParkingTrasaction 表中的“CustomerKey”是将 ParkingTransaction 连接到 Customer 的 FK。我已经编写了以下代码,它计算了 ParkingTransaction 表中最常用的 CustomerKey,它工作正常......

SELECT TOP 10 CustomerKey
, count(*) as 'Usage'
  FROM ParkingTransaction
  GROUP BY CustomerKey
  HAVING (count(CustomerKey) > 0)
  ORDER BY 'Usage' DESC

这是我的输出

Output

我面临的问题是:我想从 Customer 表中提取 FirstName 和 LastName 字段,而不是仅按 CustomerKey 排序。我已经搞砸了 JOINS,但还没有提出解决方案。

谢谢!

【问题讨论】:

  • HAVING (count(CustomerKey) > 0) 是多余的。您按CustomerKey 分组,因此每个组至少包含 1 行。它永远不能为 0 或更少。
  • MySQL 什么时候开始支持 SQL Server 风格 SELECT TOP n ...? (哎呀,这是一个问题,而不是评论。)

标签: mysql sql database join


【解决方案1】:

MySQL 使用 LIMIT 而不是 TOP。

SELECT  a.FirstName, a.LastName,
        COUNT(*) as `Usage`
FROM    Customer a
        INNER JOIN ParkingTransaction b
            ON a.CustomerKey = b.CustomerKey
GROUP BY a.FirstName, a.LastName
ORDER BY `Usage` DESC
LIMIT 10

由于查询使用的是INNER JOIN,因此在这种情况下HAVING COUNT(*) > 0 是不必要的。

【讨论】:

  • OP:请注意,没有匹配客户的停车交易将不会被返回(INNER JOIN)。如果这就是你想要的,那就完美了。
  • @showdev 是的。但在原始查询中,OP 使用 HAVING (count(CustomerKey) > 0) 过滤尚未交易的客户。
  • 是的。但是没有匹配客户的交易怎么办(例如,客户被删除但交易仍然存在。)就个人而言,我宁愿看到客户有 0 笔交易并看到交易有未知客户,而不是看不到没有交易的交易' t 有关联的客户。不过,偏好问题。干得好+1
【解决方案2】:

这是一种方法:

SELECT CustomerKey, c.firstname, c.lastname, count(*) as 'Usage'
FROM ParkingTransaction pt join
     customer c
     on pt.customerkey = c.customerkey
GROUP BY pt.CustomerKey, c.firstname, c.lastname, 
ORDER BY 'Usage' DESC
limit 10

【讨论】:

  • 发帖前请检查语法:)
  • 还有一件事,您的查询中的 having 子句没有意义,因为内部联接不会显示两边都不存在的记录。
  • @Be Happy 在原始查询中也没有意义。
  • @ypercube 你能把TOP和LIMIT结合起来吗?
猜你喜欢
  • 2018-02-17
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 2014-09-26
  • 2021-05-05
  • 2013-06-07
相关资源
最近更新 更多