Mysql取得分組最新數據

WBOY
發布: 2016-08-04 09:21:46
原創
1390 人瀏覽過

來源資料如下:

Mysql取得分組最新數據

需要的效果是根據target_id分組來取得最新的資料也就是:

Mysql取得分組最新數據

目前想到兩種方案:
方案一: 透過同表子查詢或聯查找到最大的資料ID

Mysql取得分組最新數據

還有種寫法:

<code>select * from 
(select * from track 
    where type='task' and target_id in(...) ORDER BY time DESC
) as temp 
GROUP BY  target_id</code>
登入後複製
登入後複製

方案二: 分兩步驟查詢,php中先查詢最大ID,再透過ID數組查詢清單資料

我想問的是有沒有其它簡單點的方法處理這種問題?
這種需求應該比較常見!

=====附上結構及資料=====

<code>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');</code>
登入後複製
登入後複製

回覆內容:

來源資料如下:

Mysql取得分組最新數據

需要的效果是根據target_id分組來取得最新的資料也就是:

Mysql取得分組最新數據

目前想到兩種方案:
方案一: 透過同表子查詢或聯查找到最大的資料ID

Mysql取得分組最新數據

還有種寫法:

<code>select * from 
(select * from track 
    where type='task' and target_id in(...) ORDER BY time DESC
) as temp 
GROUP BY  target_id</code>
登入後複製
登入後複製

方案二: 分兩步驟查詢,php中先查詢最大ID,再透過ID數組查詢清單資料

我想問的是有沒有其它簡單點的方法處理這種問題?
這種需求應該比較常見!

=====附上結構及資料=====

<code>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');</code>
登入後複製
登入後複製

把最大id的資料放到臨時表裡

<code>CREATE TEMPORARY TABLE tmp_id(`id` int(11) not null,PRIMARY KEY (`id`) )
</code>
登入後複製

然後

<code>INSERT INTO tmp_id SELECT max(`id`) as id FROM track GROUP BY target_id
</code>
登入後複製

然後join一下就可以了
最後還是建議明確刪除臨時表

<code>DROP TEMPORARY TABLE IF EXISTS tmp_id</code>
登入後複製

我覺得方案1A挺好了,但為什麼target_id還要寫in條件呢,不寫也是一樣的結果。

一般都是用方案1,方案1還有另一種寫法

<code>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);</code>
登入後複製
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板