【问题标题】:selecting top row of each repeating tuple according to some criteria (MYSQL)根据某些标准(MYSQL)选择每个重复元组的顶行
【发布时间】:2015-04-26 12:35:12
【问题描述】:

我有一个这样的示例表:

月市人
8 LHR ABC
10 北京 BCS
11 纽约 JJJ
11 威尼斯 hghg
11 威尼斯 KKK
12 纽约州 aa
12 ORL abc
12 ORL 英国广播公司

所以我想要实现的是在特定月份查看访问人数最多的城市

输出应该是这样的:

12 ORL  
11 VENINCE  
10 BEIJING  
8 LHR 

我已经尝试将它分组为

SELECT month, city , count(*) AS 'no of people visiting'     
FROM table
GROUP BY month, city   

这张表确实告诉我哪个城市和月份位置有多少人
访问,但我无法提取最多的月份和城市组合
相对于某个月份。

更新的查询(有错误)

SELECT *  
FROM   
( SELECT monthname(reservation.PickupDate), location.LocationName, COUNT(*) AS count
FROM reservation  NATURAL JOIN location
WHERE reservation.pickupdate >= DATE_ADD(NOW(), INTERVAL - 3 MONTH)
GROUP BY month(reservation.PickupDate), location.LocationName) AS t1
WHERE NOT EXISTS (SELECT 1
FROM reservation R1 NATURAL JOIN location L1
WHERE  monthname(R1.PickupDate) = monthname(t1.PickupDate)
GROUP BY month(R1.PickupDate), L1.LocationName) 

【问题讨论】:

    标签: mysql group-by


    【解决方案1】:

    从您的查询开始,您只需要消除那些在该月有更多访问者的城市的行:

    SELECT * 
    FROM
      (SELECT `month`, city, count(*) AS cnt 
      FROM `table` 
      GROUP BY `month`, city) t1
    WHERE NOT EXISTS(SELECT 1 
      FROM `table` t2 
      WHERE t2.`month` = t1.`month`
      GROUP BY `month`, city 
      HAVING count(*) > t1.cnt)
    

    【讨论】:

    • 你能解释一下'Select 1'吗?我理解这个查询背后的概念,但这一点我很困惑
    • 由于子查询并不意味着返回结果集,而我们只是检查是否存在一些数据,所以您在那里选择什么并不重要。您可以替换为 *,或者您喜欢的任何字段或常量。见stackoverflow.com/questions/6137433/…
    • FROM 表为连接表时,查询报错。例如 (SELECT month, city, count() AS cnt FROM table1 natural join table2 GROUP BY month, city) t1 WHERE NOT EXISTS(SELECT 1 FROM table1 natural join table2 WHERE t1.month = table1 .month GROUP BY month, city HAVING count() > t1.cnt) 在 where not exists 子句中不识别 t1
    • 错误是什么?请用您的最终查询更新您的问题。
    • 好吧,我写的实际查询如下: SELECT * FROM ( SELECT monthname(reservation.PickupDate), location.LocationName, COUNT(*) AS count FROM reservation NATURAL JOIN location WHERE reservation.pickupdate >= DATE_ADD(NOW(), INTERVAL - 3 MONTH) 按月分组(reservation.PickupDate), location.LocationName) AS t1 WHERE NOT EXISTS (SELECT 1 from reservation R1 NATURAL JOIN location L1 WHERE monthname(R1.PickupDate) = monthname (t1.PickupDate) GROUP BY month(R1.PickupDate), L1.LocationName) 错误是未知列 t1.pickupdate
    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    相关资源
    最近更新 更多