一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

mysql取出每個(gè)分組中最新的記錄...

 飲茶仙人 2021-06-19

原文:深度分析mysql GROUP BY 與 ORDER BY、mysql取出每個(gè)分組中最新的記錄mysql 分組取最新的一條記錄(整條記錄)

1、建表、插入測(cè)試數(shù)據(jù)

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  `category_id` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert  into `test`(`id`,`name`,`category_id`,`date`) values (1,'aaa',1,'2010-06-10 19:14:37'),(2,'bbb',2,'2010-06-10 19:14:55'),(3,'ccc',1,'2010-06-10 19:16:02'),(4,'ddd',1,'2010-06-10 19:16:15'),(5,'eee',2,'2010-06-10 19:16:35');

這里寫(xiě)圖片描述

我現(xiàn)在需要取出每個(gè)分類(lèi)中最新的內(nèi)容
select * from test group by category_id order by date
結(jié)果如下
這里寫(xiě)圖片描述
明顯。這不是我想要的數(shù)據(jù),原因是msyql已經(jīng)的執(zhí)行順序是:

寫(xiě)的順序:select … from… where…. group by… having… order by..
執(zhí)行順序:from… where…group by… having…. select … order by…

所以在order by拿到的結(jié)果里已經(jīng)是分組的完的最后結(jié)果。

由from到where的結(jié)果如下的內(nèi)容:
這里寫(xiě)圖片描述

到group by時(shí)就得到了根據(jù)category_id分出來(lái)的多個(gè)小組
這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

到了select的時(shí)候,只從上面的每個(gè)組里取第一條信息結(jié)果會(huì)如下
這里寫(xiě)圖片描述

即使order by也只是從上面的結(jié)果里進(jìn)行排序。并不是每個(gè)分類(lèi)的最新信息。

2、方法

下面介紹兩種方法,一種是通過(guò)子查詢(xún),一種是通過(guò)group_concat函數(shù)來(lái)實(shí)現(xiàn)。

2.1 子查詢(xún)解決方案

先將數(shù)據(jù)按照日期倒序排序(日期最新的在最前面),然后在group,這樣每個(gè)分類(lèi)的第一條肯定是日期最新的。

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

2.2 通過(guò)group_concat函數(shù)

①group_concat函數(shù)

group_concat( [DISTINCT] 要連接的字段 [Order BY 排序字段 ASC/DESC] [Separator '分隔符’] )

作用:將要連接的字段按照排序字段的順序用分隔符連起來(lái)顯示,默認(rèn)分隔符是”,”。
如:select group_concat(id order bydatedesc) fromtestgroup by category_id

按照時(shí)間排序?qū)d連接起來(lái),第一個(gè)一定是時(shí)間最新的。
這里寫(xiě)圖片描述
②substring_index

substring_index(str,delim,count),str:要處理的字符串、delim:分隔符、count:計(jì)數(shù)

例子:
  SELECT SUBSTRING_INDEX('www.test.com','.',1);
  結(jié)果是:www
  SELECT SUBSTRING_INDEX('www.test.com','.',2)
  結(jié)果是:www.test
  SELECT SUBSTRING_INDEX('www.test.com','.',-2);
  結(jié)果為:test.com
也就是說(shuō),如果count是正數(shù),那么就是從左往右數(shù),第N個(gè)分隔符的左邊的全部?jī)?nèi)容,相反,如果是負(fù)數(shù),那么就是從右邊開(kāi)始數(shù),第N個(gè)分隔符右邊的所有內(nèi)容。
③解析
GROUP_CONCAT將group by 后的id排序后連接起來(lái),SUBSTRING_INDEX取得每行(每個(gè)分類(lèi))的第一個(gè)。

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;

這里寫(xiě)圖片描述

2、3 其他方法

一般id越大的時(shí)間越近,可以先選出各個(gè)分類(lèi)最大的id,然后in。

SELECT MAX(id) AS id,category_id,MAX(DATE) FROM test GROUP BY category_id;  
SELECT * FROM test WHERE id IN (SELECT MAX(id) FROM test GROUP BY category_id);

連表,選擇出每個(gè)分類(lèi)的id和最大時(shí)間作為一個(gè)臨時(shí)表,然后原表和臨時(shí)表連接,條件是分類(lèi)id和時(shí)間相等。

SELECT * FROM test AS a, 
(SELECT category_id, MAX(DATE) AS `date` FROM test AS b GROUP BY category_id)
AS b WHERE a.category_id=b.category_id AND a.date = b.date  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    久久久精品日韩欧美丰满| 午夜视频在线观看日韩| 五月激情五月天综合网| 国产成人午夜福利片片| 国产对白老熟女正在播放| 亚洲欧美日韩综合在线成成| 亚洲精品av少妇在线观看| 污污黄黄的成年亚洲毛片| 亚洲一区二区三区免费的视频| 国产亚洲欧美一区二区| 夫妻性生活真人动作视频| 激情中文字幕在线观看| 国产精品一区二区视频大全| 精品女同一区二区三区| 91偷拍裸体一区二区三区| 日韩在线免费看中文字幕| 久久精品国产第一区二区三区| 欧美日韩人妻中文一区二区| 久久精品偷拍视频观看| 国产一级内片内射免费看 | 欧美一区二区三区性视频| 日本 一区二区 在线| 国产高清在线不卡一区| 日本不卡在线视频你懂的| 精品国产成人av一区二区三区| 日韩精品亚洲精品国产精品| 日本东京热加勒比一区二区| 99久免费精品视频在线观| 色婷婷在线视频免费播放| 国产一级一片内射视频在线| 久久综合日韩精品免费观看| 国产精品一区二区视频大全| 91国内视频一区二区三区| 夫妻性生活一级黄色录像| 欧美精品一区二区三区白虎| 欧美丝袜诱惑一区二区| 日韩免费国产91在线| 欧美日韩精品久久第一页| 中文字幕久久精品亚洲乱码| 日韩在线免费看中文字幕| 亚洲深夜精品福利一区|