Mysql获取分组最新数据

php中文网
发布: 2016-08-04 09:21:46
原创
1586人浏览过

源数据如下:

Mysql获取分组最新数据

需要的效果是根据target_id分组取得最新的数据也就是:

Mysql获取分组最新数据

I-Shop购物系统
I-Shop购物系统

部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/

I-Shop购物系统 0
查看详情 I-Shop购物系统

目前想到两种方案:
方案一: 通过同表子查询或联查找到最大的数据ID

Mysql获取分组最新数据

还有种写法:

select * from 
(select * from track 
    where type='task' and target_id in(...) ORDER BY time DESC
) as temp 
GROUP BY  target_id
登录后复制

方案二: 分两步查询,php中先查询最大ID,再通过ID数组查询列表数据

我想问的是有没有其它简单点的方法处理这种问题?
这种需求应该比较常见!

=====附上结构及数据=====

DROP TABLE IF EXISTS `track`;
CREATE TABLE `track` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(50) NOT NULL DEFAULT '' COMMENT 'task => 任务跟进,project => 项目跟进 ',
  `target_id` int(11) DEFAULT '0' COMMENT '跟进目标ID',
  `user_id` int(11) DEFAULT '0' COMMENT '跟进用户',
  `user_name` varchar(100) DEFAULT '' COMMENT '跟进用户名称',
  `content` varchar(500) DEFAULT '' COMMENT '跟进内容',
  `time` int(11) DEFAULT '0' COMMENT '跟进时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='跟进记录表';

-- ----------------------------
-- Records of track
-- ----------------------------
INSERT INTO `track` VALUES ('1', 'task', '67', '1', '超级管理员', '无所谓...', '1467774850');
INSERT INTO `track` VALUES ('2', 'task', '67', '1', '超级管理员', 'TTTT', '1467777620');
INSERT INTO `track` VALUES ('7', 'task', '67', '1', '超级管理员', '只耗损', '1468288894');
INSERT INTO `track` VALUES ('8', 'task', '34', '1', '超级管理员', 'STS', '1468288917');
INSERT INTO `track` VALUES ('9', 'task', '34', '1', '超级管理员', '吊顶', '1468288954');
登录后复制

回复内容:

源数据如下:

Mysql获取分组最新数据

需要的效果是根据target_id分组取得最新的数据也就是:

Mysql获取分组最新数据

目前想到两种方案:
方案一: 通过同表子查询或联查找到最大的数据ID

Mysql获取分组最新数据

还有种写法:

select * from 
(select * from track 
    where type='task' and target_id in(...) ORDER BY time DESC
) as temp 
GROUP BY  target_id
登录后复制

方案二: 分两步查询,php中先查询最大ID,再通过ID数组查询列表数据

我想问的是有没有其它简单点的方法处理这种问题?
这种需求应该比较常见!

=====附上结构及数据=====

DROP TABLE IF EXISTS `track`;
CREATE TABLE `track` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(50) NOT NULL DEFAULT '' COMMENT 'task => 任务跟进,project => 项目跟进 ',
  `target_id` int(11) DEFAULT '0' COMMENT '跟进目标ID',
  `user_id` int(11) DEFAULT '0' COMMENT '跟进用户',
  `user_name` varchar(100) DEFAULT '' COMMENT '跟进用户名称',
  `content` varchar(500) DEFAULT '' COMMENT '跟进内容',
  `time` int(11) DEFAULT '0' COMMENT '跟进时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='跟进记录表';

-- ----------------------------
-- Records of track
-- ----------------------------
INSERT INTO `track` VALUES ('1', 'task', '67', '1', '超级管理员', '无所谓...', '1467774850');
INSERT INTO `track` VALUES ('2', 'task', '67', '1', '超级管理员', 'TTTT', '1467777620');
INSERT INTO `track` VALUES ('7', 'task', '67', '1', '超级管理员', '只耗损', '1468288894');
INSERT INTO `track` VALUES ('8', 'task', '34', '1', '超级管理员', 'STS', '1468288917');
INSERT INTO `track` VALUES ('9', 'task', '34', '1', '超级管理员', '吊顶', '1468288954');
登录后复制

把最大id的数据放到临时表里

CREATE TEMPORARY TABLE tmp_id(`id` int(11) not null,PRIMARY KEY (`id`) )
登录后复制

然后

INSERT INTO tmp_id SELECT max(`id`) as id FROM track GROUP BY target_id
登录后复制

然后join一下就可以了
最后还是建议显式删除临时表

DROP TEMPORARY TABLE IF EXISTS tmp_id
登录后复制

我觉得方案1A挺好了,不过为什么target_id还要写in条件呢,不写也是一样的结果。

一般都是用方案1,方案1还有另一种写法

select * from track where id in(select substring_index(group_concat(id order by id desc),',',1) as maxid  from track group by target_id);
登录后复制
相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号