欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql查詢連續(xù)記錄方式

 更新時間:2022年05月07日 14:51:36   作者:小Z筆記  
這篇文章主要介紹了mysql查詢連續(xù)記錄方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

案例

最近遇到一個業(yè)務需求, 需要查找滿足條件且連續(xù)3出現(xiàn)條以上的記錄。

表結(jié)構(gòu):

CREATE TABLE `cdb_labels` (
? `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
? `type` int(11) NOT NULL DEFAULT '0' COMMENT '標簽類型:1喜歡異性類型,2擅長話題',
? `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '標簽內(nèi)容',
? PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8 COMMENT='標簽內(nèi)容';

所有數(shù)據(jù):

SELECT * FROM cdb_labels WHERE type = 1;

這里寫圖片描述

解決思路

1.對滿足初次查詢的數(shù)據(jù)賦予一個自增列b

 select id,type,content,(@b:=@b+1) as b from cdb_labels a,(SELECT @b := 0) tmp_b where type=1;

這里寫圖片描述

2.用自增的id減去自增列b

select id,type,content,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1;

這里寫圖片描述

3.對等差列c分組, 并將分組的id組裝起來

select count(id),GROUP_CONCAT(id) from ( 
    select id,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1 
) as d GROUP BY c;

這里寫圖片描述

注:為了方便區(qū)分,這里查詢分組成員要大于5(也就是連續(xù)出現(xiàn)超過5次的記錄):

select if( count(id)>5 ,GROUP_CONCAT(id),null) e from (?
? ? select id,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1?
) as d GROUP BY c;

那么得到的數(shù)據(jù)只有:9,10,11,12,13,14,15 

這里寫圖片描述

4.根據(jù)組裝的id去找數(shù)據(jù)

select id,type,content from cdb_labels,(
    select if( count(id)>5 ,GROUP_CONCAT(id),null) e from ( 
        select id,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1 
    ) as d GROUP BY c
) as f where f.e is not null and FIND_IN_SET(id , f.e);

這里寫圖片描述

總結(jié)建議

  • MySQL的函數(shù)例如: GROUP_CONCAT() 的字符長度有限制(默認1024),如果連續(xù)記錄較多會發(fā)生字符截取報錯;
  • 建議可以分步驟去查詢,防止嵌套子查詢,還可以提升性能而且避免使用MySQL函數(shù);

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。 

相關(guān)文章

最新評論