【问题标题】:Finding condition based values from more than one table using group by clause in Mysql在 Mysql 中使用 group by 子句从多个表中查找基于条件的值
【发布时间】:2013-11-07 09:58:09
【问题描述】:

我有两张桌子

`timezone_detail` (
     `timezone_detail_id` INT(11) NOT NULL AUTO_INCREMENT,
     `abbreviation` VARCHAR(6) DEFAULT NULL,
     `time_start` BIGINT(11) DEFAULT NULL,
     `time_zone_id` INT(11) DEFAULT NULL
 )
 `time_zone` (                                    
     `time_zone_id` INT(10) NOT NULL AUTO_INCREMENT,
     `timezone_name` VARCHAR(100) DEFAULT NULL,
     `country_code` VARCHAR(5) DEFAULT NULL
  ) 

我将查询应用为

SELECT z.country_code,tz.abbreviation,tz.time_start
FROM `time_zone` z
 LEFT JOIN `timezone_detail` tz ON z.time_zone_id = tz.time_zone_id

country_code    abbreviation    time_start
AE                LMT          -2147483648
AE                LMT          -2147397248
AE                GST          -1577936472
AF                AFT          -2147483648
AF                AFT          -2147397248
AF                AFT          -788932800
IN                IST          -872058600
IN                IST          -862637400
IN                IST          -764145000


after using **GROUP BY tz.country_code** it gives all first record as
AE  LMT -2147483648
AF  AFT -2147483648
IN  IST -872058600

but I want records with maximum time_start in each group as 

AE  GST -1577936472
AF  AFT -788932800
IN  IST -764145000

请帮助找到这些记录。谢谢

【问题讨论】:

    标签: mysql group-by


    【解决方案1】:

    使用having子句:

    SELECT z.country_code, tz.abbreviation, MIN(tz.time_start) as time_start
        FROM time_zone z LEFT JOIN timezone_detail tz ON z.time_zone_id = tz.time_zone_id
        GROUP BY tz.country_code HAVING MIN(tz.time_start)
    

    【讨论】:

    • tz.abbreviation 被遗漏分组
    • @Justin 这不是必需的,而是使用 country_code 上的群组进行分组
    • @AnkitKumar 使用 MIN 而不是 MAX。正如我看到你的要求。
    • No No.. 同样的结果即将到来。这些功能在这里不起作用。
    • @AnkitKumar 我已经更新了答案。检查并告诉我。
    【解决方案2】:

    查询:

       SELECT z.country_code,
              tz.abbreviation,
              tz.time_start
       FROM time_zone z 
       LEFT JOIN timezone_detail tz ON z.time_zone_id = tz.time_zone_id
       JOIN (SELECT z.country_code, tz.abbreviation, MAX(tz.time_start) time_start
             FROM time_zone z 
             LEFT JOIN timezone_detail tz ON z.time_zone_id = tz.time_zone_id
             GROUP BY z.country_code, tz.abbreviation ) a
        ON z.country_code = a.country_code 
              tz.abbreviation =a.abbreviation 
              tz.time_start = a.time_start 
    

    【讨论】:

    • 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“(PARTITION BY z.country_code,tz.abbreviation ORDER BY tz.time_start DESC) AS rnk”附近使用正确的语法
    • 嗨贾斯汀,感谢您的回复。但这不适用于我的情况。以上是错误。
    • @AnkitKumar 更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2016-09-06
    • 2020-01-22
    • 2014-08-30
    • 2013-11-02
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多