单语句SQL查询(nba连续夺冠、用户连续登录)解决思路

用一个例子做为讲解:查询NBA球队在此期间连续获得冠军的有哪些,其连续的年份的起止时间是多少?

单语句SQL查询(nba连续夺冠、用户连续登录)解决思路_第1张图片

查询结果如下:

单语句SQL查询(nba连续夺冠、用户连续登录)解决思路_第2张图片

# 创建表
create table if not exists nba(
    team VARCHAR(10),
    y int(4)
);

# 插入数据
insert into nba(team,y) values
('活塞',1990),
('公牛',1991),
('公牛',1992),
('公牛',1993),
('火箭',1994),
('火箭',1995),
('公牛',1996),
('公牛',1997),
('公牛',1998),
('马刺',1999),
('湖人',2000),
('湖人',2001),
('湖人',2002),
('马刺',2003),
('活塞',2004),
('马刺',2005),
('热火',2006),
('马刺',2007),
('凯尔特人',2008),
('湖人',2009),
('湖人',2010);

解决思路是首先计算出各队每年连续夺冠的记录数con_col,其次是增加一列递增数作为辅助列help_col;help_col - con_col得到数相同就是连续夺冠的记录;再对help_col - con_col进行分组并过滤掉记录数小于1(不满足连续夺冠条件)。

查询sql:
SELECT
	team,
	MIN(Y) as start,
	MAX(Y) as end
FROM
	(
		SELECT
			team,
			y,
			IF (
				CRC32(@team) = CRC32(team) ,@rn :=@rn + 1,
				@rn := 1
			) AS con_col,
			@rwn :=@rwn + 1 AS help_col ,
			@team := team
		FROM
			nba,
			(
				SELECT
					@team := '' ,@rn := 0 ,@rwn := 0
			) a
	) c
GROUP BY
	con_col - help_col
HAVING
	count(1) > 1
ORDER BY start

针对查询单个队SQL:

SELECT
	team,
	MIN(Y) as start,
	MAX(Y) as end
FROM
	(
		SELECT
			team,
			y,
			IF (
				@team = y ,@rn :=@rn + 1,
				@rn := 1
			) AS con_col,
			@rwn :=@rwn + 1 AS help_col ,
			@team := y + 1
		FROM
			nba,
			(
				SELECT
					@team := '' ,@rn := 0 ,@rwn := 0
			) a
		WHERE team = "公牛"
	) c
GROUP BY
	con_col - help_col
HAVING
	count(1) > 1
ORDER BY start

查询用户连续登录也是同样的道理;理解了解决思路,问题就迎刃而解了。

你可能感兴趣的:(解决方案)