mysql多种条件分组排序求某类最新一条

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
  `category_id` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

这两天让一个数据查询难了。主要是对group by 理解的不够深入。才出现这样的情况,后来网上学习了一下,并记录下来分享给大家。这种需求,我想很多人都遇到过。下面是我模拟我的内容表

我现在需要取出每个分类中最新的内容

select * from test group by category_id order by `date`

结果如下

明显。这不是我想要的数据,正确的SQL语句如下:

select a.* from test a where 1 > (select count(*) from test where category_id = a.category_id and date > a.date) order by a.name,a.date

写的顺序:select ... from... where.... group by... having... order by..
执行顺序:from... where...group by... having.... select ... order by...

所以在order by拿到的结果里已经是分组的完的最后结果。
由from到where的结果如下的内容。

到group by时就得到了根据category_id分出来的多个小组

到了select的时候,只从上面的每个组里取第一条信息结果会如下

即使order by也只是从上面的结果里进行排序。并不是每个分类的最新信息。
回到我的目的上 --分类中最新的信息
根据上面的分析,group by到select时只取到分组里的第一条信息。有两个解决方法
1,where+group by(对小组进行排序)
2,从form返回的数据下手脚(即用子查询)

由where+group by的解决方法
对group by里的小组进行排序的函数我只查到group_concat()可以进行排序,但group_concat的作用是将小组里的字段里的值进行串联起来。

select group_concat(id order by `date` desc) from `test` group by category_id

再改进一下

select * from `test` where id in(select SUBSTRING_INDEX(group_concat(id order by `date` desc),‘,‘,1) from `test` group by category_id ) order by `date` desc

子查询解决方案

select * from (select * from `test` order by `date` desc) `temp`  group by category_id order by `date` desc

还可以这样

SELECT * FROM test t WHERE date=(select MAX(date) from test where category_id=t.category_id) GROUP BY category_id  order by `date` desc;

个人使用:

根据要求需要求表单关联项目下,每个项目每年最新的一条表单数据。

外键ID vc_invest_id ,vc_report_year 两种类型进行分组 求最新一条,原始的order by 会自动按照l_id从小到大排序不满足。

正确做法先查询结果,再加如下限制条件。

只需要在查询结果后面加上如下:

l_id in (
select SUBSTRING_INDEX(group_concat(l_id order by d_create_time desc),‘,‘,1) from fin_report group by VC_INVEST_ID ,VC_REPORT_YEAR
)

转:http://www.manongjc.com/article/1083.html

转:https://www.cnblogs.com/fps2tao/p/9038268.html

原文地址:https://www.cnblogs.com/beautyscenery/p/12034272.html

时间: 2024-10-06 15:21:25

mysql多种条件分组排序求某类最新一条的相关文章

mysql 实现row_number() 分组排序功能

数据库基本脚本 CREATE TABLE `a` ( `ID` INT(10) NULL DEFAULT NULL, `class` INT(10) NULL DEFAULT NULL, `score` INT(10) NULL DEFAULT NULL ) COLLATE='utf8_general_ci' ENGINE=InnoDB; insert into a values (1,1,110); insert into a values (2,1,120); insert into a v

mysql或者oracle分组排序取前几条数据

mysql: select a.* from(select t1.*,(select count(*)+1 from 表 where 分组字段=t1.分组字段 and 排序字段<t1.排序字段) as group_idfrom 表 t1) awhere a.group_id<=3 Oracle: SELECT t.*            FROM (SELECT ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段 DESC) rn,      

sql实现对多个条件分组排序方法和区别

转自: http://blog.csdn.net/winer2008/article/details/4283539 rank,dense_rank,row_number区别 一:语法(用法):     rank() over([partition by col1] order by col2)      dense_rank() over([partition by col1] order by col2)      row_number() over([partition by col1]

hive 分组排序,topN

语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rankpartition by:类似hive的建表,分区的意思:order by :排序,默认是升序,加desc降序:rank:表示别名表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的) -- 分组排序-- 求某用户日期最大的3天select a.* from( select p_day,muuid,r

MySQL进阶5--分组排序和分组查询 group by(having) /order by

MySQL进阶--分组排序和分组查询 group by(having) /order by /* 介绍分组函数 功能:用做统计使用,又称为聚合函数或组函数 1.分类: sum, avg 求和 /平均数, 只处理数值型,都绝对忽略NULL值(avg处理时统计的个数没有null项) max ,min ,可以求字符串最大最小 ,可以匹配日期,都绝对忽略NULL值 count ,不计算NULL ,不把null算进数里 #2. 参数支持类型 SELECT MIN(last_name) ,MAX(last_

oracle入门(8)——实战:支持可变参数、多种条件、多个参数排序、分页的存储过程查询组件

[本文介绍] 学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作.也没考虑算法上的优化,查询速度要比hibernate只快了一点点,可能是不涉及多表查询的缘故吧,多表的情况下才更快. 经非专业的测试,在有分页的情况下,在300万条数据里面查询的时间保持在0.1秒内.相同查询条件+分页的情况下,hibernate 用时0.3秒内. 不分页的条件下,查出来的数据越多,时间越长,时间长的话,跟hibernate相相比就没什么优势了. [思路] 我的思路是从java传来”字

MySQL高级分组排序

想要根据用户分组,以该用户的下单时间为降序,提取所有用户的第二个订单信息.这属于分组排序,在Oracle有内置函数可以实现,而在mysql就有点麻烦: CREATE TABLE user_orders (orders_id INT UNSIGNED NOT NULL, user_id INT UNSIGNED NOT NULL, add_time INT UNSIGNED NOT NULL, PRIMARY KEY(orders_id), KEY(user_id), KEY(add_time)

MySql 分组排序取时间最大的一条记录

SELECT A.* FROM digital_asset A, (SELECT name, max(last_updated) max_day FROM digital_asset GROUP BY name) B WHERE A.name = B.name AND A.last_updated = B.max_day SELECT A . * FROM bbs_threads A, ( SELECT digest, max( dateline ) max_dateline FROM bbs_

mysql中条件查询加排序和索引的关系

跟一个朋友,不错公司的主管交流时,对于mysql中条件查询和排序时 与索引的关系 mysql> explain select * from article where title='希望光伏企业挺过2个月' o rder by id desc\\\\\\\\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: article type: index pos