MySQL查询:查询一个表中类别字段中Max()最大值对应的记录

转:https://my.oschina.net/hanzhankang/blog/210623

 问题是:

数据库有一个表 code,里面有个点击量字段click_num和一个类别字段kind以及其它信息字段,

现在要搜出每个类别中点击量最大的那条记录,如果是10个类别,那么结果应该是10条记录,

如果最大点击量有两个相同的只要一条。

经过N次搜索,N次检测网上的解决SQL语句,终于找到个优雅的而且结果正确的SQL,这个是一个博客作者在Mysql的官方文档里面发现的。

禁不住收藏了,以备后用。

select id,kind,click_num from code as a   
where  click_num=(select max(b.click_num)  
    from code as b  
    where a.kind = b.kind  
); 

特别注意:

这个语句在SQLite上测试正常,速度很快。但是在我机器上的MySql5.0上执行后就死机了,其他版本的Mysql不知道什么情况。

上面的语句还不能满足我的第二个要求就是:如果某类别中最大点击量有两个相同的记录,只要一条。

下面是我附加的解决办法:

筛选,保证每个类别只有一条,(kind,id改为所有列,结果就是对应的记录了)

select  *   
from (select id,kind,click_num from code as a
    where  click_num=(select max(b.click_num)  
        from code as b  
        where a.kind = b.kind  
        )  
    ) as a  
group by kind  

后续:

结合以往的Mysql使用经验发现Mysql的一个最大问题就是在一个查询的where子句中如果包含对前面select的表的查询那么CPU占用就会飙升Mysql服务停止。可以说是自连接查询问题,不知道这是不是个bug,5.0,5.1版本都有这个问题,回头看看上面的SQL语句正好符合了这个问题,解决办法就是把子查询的表弄成一个临时表或者视图总之不能和前面的select的表是同一个表,那么问题就解决了,于是乎,对上面的SQL稍作修改就可以在Mysql上跑了。

修改过程:

1.建立一个视图max_click,存储的是每个类别最大的点击量

create view max_click as select max(click_num) as click_num,kind   
    from code   
    group by kind; 

2  .筛选,保证每个类别只有一条记录
select  *   
from (select id,kind,click_num  
        from  code  
        where click_num = ( select b.click_num  
            from max_click as b  
            where code.kind = b.kind  
        )  
    ) as a  
group by kind; 

运行正常,速度0.78秒。(表中一共23000条数据) Okay! 大功告成!

最前面第一个SQL在MSSQL上运行不知道行不行,我想在SQLite能正常在MSSQL上应该没问题,看来Mysql需要改进的地方很多啊,同样是开源的SQLite就可以做到的,而且SQLite那么轻量级就几百KB,Mysql更应该能做到。


### 回答1: 您可以使用MySQL的GROUP BY语句和MAX()聚合函数来查询表中某个时间最大值,然后按照某个字段分组。假设您要查询的表名为`table_name`,时间字段为`time_field`,分组字段为`group_field`,则可以使用以下查询语句: ``` SELECT group_field, MAX(time_field) AS max_time FROM table_name GROUP BY group_field; ``` 这将返回每个分组字段的最大时间值。如果您还需要包括其他字段,则可以将它们添加到SELECT语句,并将它们添加到GROUP BY语句,如下所示: ``` SELECT group_field, other_field, MAX(time_field) AS max_time FROM table_name GROUP BY group_field, other_field; ``` 这将返回每个分组字段和其他字段的最大时间值。 ### 回答2: 要查询表中某个时间字段最大值,并按照另一个字段进行分组,可以使用以下SQL语句: ```sql SELECT 分组字段, MAX(时间字段) AS 最大时间 FROM 表名 GROUP BY 分组字段; ``` 具体步骤如下: 1. 使用SELECT语句来选择字段,并使用MAX函数获取时间字段最大值。将结果命名为"最大时间"。 2. 使用FROM语句指定要查询的表名。 3. 使用GROUP BY语句来按照指定的字段进行分组。 4. 最后,执行上述SQL语句,查询表中某个时间字段最大值,按照某个字段进行分组,并返回结果。 注意事项: - 将"表名"替换为实际的表名。 - 将"时间字段"和"分组字段"替换为实际的字段名。 - 如果要增加其他字段的输出,可在SELECT语句添加。 例如,查询一个名为"orders"的表中"order_date"字段的最大日期,按照"customer_id"字段进行分组: ```sql SELECT customer_id, MAX(order_date) AS 最大日期 FROM orders GROUP BY customer_id; ``` 这将返回一个结果集,其每个分组的"customer_id"和对应的最大日期。 ### 回答3: 可以通过以下步骤使用MySQL查询表中某个时间最大值并按照某个字段分组: 1. 使用MAX()函数找到表中某个时间字段最大值。例如,如果时间字段名为"timestamp",则可以使用以下语句获取最大值: SELECT MAX(timestamp) FROM 表名; 2. 使用GROUP BY子句按照某个字段分组。假设要按照字段"category"进行分组,则可以在查询语句添加以下代码: GROUP BY category; 所以,最终的查询语句将类似于: SELECT MAX(timestamp) FROM 表名 GROUP BY category; 以上查询语句将返回每个不同类别的时间字段最大值,并按照类别分组。 注意:请将"表名"和"timestamp"字段名替换为实际使用的表和字段名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值