六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

講解mysql group by 組內排序的方法

[摘要]mysql的group by語法可以根據指定的規則對數據進行分組,分組就是將一個數據集劃分成若干個小區域,然后再針對若干個小區域進行數據處理。本文將介紹mysql使用group by分組時,實現組內...

mysql的group by語法可以根據指定的規則對數據進行分組,分組就是將一個數據集劃分成若干個小區域,然后再針對若干個小區域進行數據處理。本文將介紹mysql使用group by分組時,實現組內排序的方法。

mysql的group by語法可以對數據進行分組,但是分組后的數據并不能進行組內排序。
例如一個評論表有多個用戶評論,需要獲取每個用戶最后評論的內容。

創建測試數據表及數據

CREATE TABLE `comment` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `user_id` int(10) unsigned NOT NULL,  `content` varchar(200) NOT NULL,  `addtime` datetime NOT NULL,  `lastmodify` datetime NOT NULL,  PRIMARY KEY (`id`),  KEY `user_id` (`user_id`),  KEY `addtime` (`addtime`),  KEY `uid_addtime` (`user_id`,`addtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `comment` (`id`, `user_id`, `content`, `addtime`, `lastmodify`) VALUES(1, 1, '評論1', '2017-05-17 00:00:00', '2017-05-17 00:00:00'),
(2, 1, '評論2', '2017-05-17 00:00:01', '2017-05-17 00:00:01'),
(3, 2, '評論1', '2017-05-17 00:00:02', '2017-05-17 00:00:02'),
(4, 2, '評論2', '2017-05-17 00:00:03', '2017-05-17 00:00:03'),
(5, 3, '評論1', '2017-05-17 00:00:04', '2017-05-17 00:00:04'),
(6, 1, '評論3', '2017-05-17 00:00:05', '2017-05-17 00:00:05'),
(7, 4, '評論1', '2017-05-17 00:00:06', '2017-05-17 00:00:06'),
(8, 4, '評論2', '2017-05-17 00:00:07', '2017-05-17 00:00:07'),
(9, 4, '評論3', '2017-05-17 00:00:08', '2017-05-17 00:00:08'),
(10, 4, '評論4', '2017-05-17 00:00:09', '2017-05-17 00:00:09'),
(11, 3, '評論2', '2017-05-17 00:00:10', '2017-05-17 00:00:10');select * from comment;+----+---------+---------+---------------------+---------------------+  id   user_id   content   addtime               lastmodify           
+----+---------+---------+---------------------+---------------------+   1         1   評論1     2017-05-17 00:00:00   2017-05-17 00:00:00  
   2         1   評論2     2017-05-17 00:00:01   2017-05-17 00:00:01  
   3         2   評論1     2017-05-17 00:00:02   2017-05-17 00:00:02  
   4         2   評論2     2017-05-17 00:00:03   2017-05-17 00:00:03  
   5         3   評論1     2017-05-17 00:00:04   2017-05-17 00:00:04  
   6         1   評論3     2017-05-17 00:00:05   2017-05-17 00:00:05  
   7         4   評論1     2017-05-17 00:00:06   2017-05-17 00:00:06  
   8         4   評論2     2017-05-17 00:00:07   2017-05-17 00:00:07  
   9         4   評論3     2017-05-17 00:00:08   2017-05-17 00:00:08  
  10         4   評論4     2017-05-17 00:00:09   2017-05-17 00:00:09  
  11         3   評論2     2017-05-17 00:00:10   2017-05-17 00:00:10  
+----+---------+---------+---------------------+---------------------+

在comment表中,每個用戶最后評論的內容就是id為6,4,11,10的記錄。

使用group by查詢

select * from comment group by user_id;
+----+---------+---------+---------------------+---------------------+  id   user_id   content   addtime               lastmodify           
+----+---------+---------+---------------------+---------------------+   1         1   評論1     2017-05-17 00:00:00   2017-05-17 00:00:00  
   3         2   評論1     2017-05-17 00:00:02   2017-05-17 00:00:02  
   5         3   評論1     2017-05-17 00:00:04   2017-05-17 00:00:04     7         4   評論1     2017-05-17 00:00:06   2017-05-17 00:00:06  
+----+---------+---------+---------------------+---------------------+

可以看到結果,分組后只會返回分組內的第一條數據。因為group by語法沒有進行組內排序的功能,只會按mysql默認的排序顯示。
如何才能對group by分組內的數據進行排序了,這個需要根據不同的需求處理。

1.id最大的,評論時間肯定最新

這種情況我們可以使用id代替時間去搜尋并組內排序,使用max(id)就可以獲取到每個分組中最大的評論id(即最新的評論)

select * from comment where id in(select max(id) from comment group by user_id) order by user_id;
+----+---------+---------+---------------------+---------------------+  id   user_id   content   addtime               lastmodify           
+----+---------+---------+---------------------+---------------------+   6         1   評論3     2017-05-17 00:00:05   2017-05-17 00:00:05  
   4         2   評論2     2017-05-17 00:00:03   2017-05-17 00:00:03  
  11         3   評論2     2017-05-17 00:00:10   2017-05-17 00:00:10    10         4   評論4     2017-05-17 00:00:09   2017-05-17 00:00:09  
+----+---------+---------+---------------------+---------------------+

2.id與評論時間沒有關系,id大的評論時間可能不是最新

這種情況我們就需要使用max(addtime)來獲取最新的評論,但因為不同用戶的評論時間有可能相同,因此還需要加多user_id這個條件去查詢。

重新創建測試數據

truncate table comment;INSERT INTO `comment` (`id`, `user_id`, `content`, `addtime`, `lastmodify`) VALUES(1, 1, '評論1', '2017-05-17 00:00:00', '2017-05-17 00:00:00'),
(2, 1, '評論2', '2017-05-17 00:10:01', '2017-05-17 00:10:01'),
(3, 2, '評論1', '2017-05-17 00:10:02', '2017-05-17 00:10:02'),
(4, 2, '評論2', '2017-05-17 00:00:03', '2017-05-17 00:00:03'),
(5, 3, '評論1', '2017-05-17 00:10:04', '2017-05-17 00:10:04'),
(6, 1, '評論3', '2017-05-17 00:00:05', '2017-05-17 00:00:05'),
(7, 4, '評論1', '2017-05-17 00:00:06', '2017-05-17 00:00:06'),
(8, 4, '評論2', '2017-05-17 00:10:07', '2017-05-17 00:10:07'),
(9, 4, '評論3', '2017-05-17 00:00:08', '2017-05-17 00:00:08'),
(10, 4, '評論4', '2017-05-17 00:00:09', '2017-05-17 00:00:09'),
(11, 3, '評論2', '2017-05-17 00:00:10', '2017-05-17 00:00:10');select * from comment;+----+---------+---------+---------------------+---------------------+  id   user_id   content   addtime               lastmodify           
+----+---------+---------+---------------------+---------------------+   1         1   評論1     2017-05-17 00:00:00   2017-05-17 00:00:00  
   2         1   評論2     2017-05-17 00:10:01   2017-05-17 00:10:01  
   3         2   評論1     2017-05-17 00:10:02   2017-05-17 00:10:02  
   4         2   評論2     2017-05-17 00:00:03   2017-05-17 00:00:03  
   5         3   評論1     2017-05-17 00:10:04   2017-05-17 00:10:04  
   6         1   評論3     2017-05-17 00:00:05   2017-05-17 00:00:05  
   7         4   評論1     2017-05-17 00:00:06   2017-05-17 00:00:06  
   8         4   評論2     2017-05-17 00:10:07   2017-05-17 00:10:07  
   9         4   評論3     2017-05-17 00:00:08   2017-05-17 00:00:08  
  10         4   評論4     2017-05-17 00:00:09   2017-05-17 00:00:09  
  11         3   評論2     2017-05-17 00:00:10   2017-05-17 00:00:10  
+----+---------+---------+---------------------+---------------------+

符合條件的應該是id為2,3,5,8的記錄

select a.* from comment as a right join (select user_id, max(addtime) as maxtime from comment where user_id is not null group by user_id) as b 
on a.user_id=b.user_id and a.addtime=b.maxtime order by a.user_id asc;+------+---------+---------+---------------------+---------------------+  id     user_id   content   addtime               lastmodify           
+------+---------+---------+---------------------+---------------------+     2         1   評論2     2017-05-17 00:10:01   2017-05-17 00:10:01  
     3         2   評論1     2017-05-17 00:10:02   2017-05-17 00:10:02  
     5         3   評論1     2017-05-17 00:10:04   2017-05-17 00:10:04  
     8         4   評論2     2017-05-17 00:10:07   2017-05-17 00:10:07  
+------+---------+---------+---------------------+---------------------+

使用right join可以減少外層的數據集。
where user_id is not null 可以使group by user_id時使用索引。

本篇文章講解了mysql group by 組內排序的方法 ,更多相關內容請關注php中文網。

相關推薦:

如何利用php 來反射API獲取類信息

詳解在mysql查詢時,offset過大影響性能的原因與優化方法

關于php使用正則去除寬高樣式的方法

以上就是講解mysql group by 組內排序的方法的詳細內容,更多請關注php中文網其它相關文章!


學習教程快速掌握從入門到精通的SQL知識。




主站蜘蛛池模板: 亚洲视频中文字幕在线观看 | 青青青线在线观看 | 亚洲第1页| 五月开心激情网 | 日日人人| 日韩欧美福利视频 | 一道本不卡视频 | 色综合久久久久久888 | 啪啪免费小视频 | 色爱综合网欧美 | 日韩在线小视频 | 日韩aa| 欧美一级片观看 | 日韩精品一区二区三区毛片 | 天天视频色版 | 欧美一区二区激情三区 | 婷婷射丁香 | 亚洲最大综合网 | 羞羞漫画弹窗 | 无码日韩精品一区二区免费 | 日韩在线不卡 | 日韩欧美在线观看一区 | 影音先锋精品国产资源 | 欧美洲大黑香蕉在线视频 | 亚洲国产成人精品一区91 | 欧美一区二区免费 | 伊人网在线视频 | 视频一区二区免费 | 亚洲影院在线播放 | 欧美一区二区激情视频 | 日韩精品永久免费播放平台 | 亚洲国产成人久久精品影视 | 伊人成影院| 亚洲成人精品 | 四虎精品福利视频精品 | 涩综合 | 最新国产福利在线观看 | 四虎黄色影院 | 色欧美视频 | 在线岛国片 | 特色毛片|