MySQL实现Oracle的rank over(partition by...order by)叠加start with...connect by...prior...函数
发布日期:2022-03-03 10:44:10 浏览次数:1 分类:技术文章

本文共 1931 字,大约阅读时间需要 6 分钟。

建表SQL

SET FOREIGN_KEY_CHECKS=0;DROP TABLE IF EXISTS `tb_tags`;CREATE TABLE `tb_tags` (  `bid` tinyint(1) unsigned NOT NULL AUTO_INCREMENT,  `pid` tinyint(1) NOT NULL DEFAULT '0',  `label` varchar(32) COLLATE utf8_bin NOT NULL,  `hits` tinyint(1) NOT NULL,  `weight` tinyint(1) NOT NULL,  PRIMARY KEY (`bid`)) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

组内排序

IF (
@lev = rc.grade,
@rank := @rank + 1,
@rank := 1)

分层级联查询

SELECT    id_grp.grade,    b.bid,    b.label,    b.hits,    b.weightFROM    (SELECT    @ids AS _ids,    (SELECT    @ids := GROUP_CONCAT(bid)FROM    tb_tagsWHERE    FIND_IN_SET(pid, @ids)    ) AS cids,    @l := @l + 1 AS gradeFROM    tb_tags,    (SELECT @ids := 2, @l := 0) bWHERE    @ids IS NOT NULL    ) id_grp,    tb_tags bWHERE    FIND_IN_SET(b.bid, id_grp._ids)ORDER BY    grade,    bid

 

完整的查询SQL

SELECT    rc.bid,    rc.label,    rc.hits,    rc.weight,IF (    @lev = rc.grade,    @rank := @rank + 1,    @rank := 1) AS rank, (@lev := rc.grade) AS gradeFROM    (        SELECT            id_grp.grade,            b.bid,            b.label,            b.hits,            b.weight        FROM            (                SELECT                    @ids AS _ids,                    (                        SELECT                            @ids := GROUP_CONCAT(bid)                        FROM                            tb_tags                        WHERE                            FIND_IN_SET(pid, @ids)                    ) AS cids,                    @l := @l + 1 AS grade                FROM                    tb_tags,                    (SELECT @ids := 2, @l := 0) b                WHERE                    @ids IS NOT NULL            ) id_grp,            tb_tags b        WHERE            FIND_IN_SET(b.bid, id_grp._ids)        ORDER BY            grade,            bid    ) rc,    (SELECT @rank := 0, @lev := NULL) rdORDER BY  grade,    rc.hits DESC,    rc.weight DESC

 

结果如图

 

参考

转载地址:https://blog.csdn.net/yangjiegang8/article/details/106452105 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Vue开发踩坑及自救纪实
下一篇:接口和抽象类之间的区别

发表评论

最新留言

不错!
[***.36.148.125]2022年07月27日 01时00分49秒