#The problem of displaying only n consecutive rows for query results in mysql#
A problem encountered on the collar button: finding the display of 3 consecutive lines of results that meet the conditions
X city built a new stadium, each day many people visit it and the stats are saved as these columns: id, date, peopleļ¼ Please write a query to display the records which have 3 or more consecutive rows and the amount of people more than 100(inclusive). For example, the table stadium: +------+------------+-----------+ | id | date | people | +------+------------+-----------+ | 1 | 2017-01-01 | 10 | | 2 | 2017-01-02 | 109 | | 3 | 2017-01-03 | 150 | | 4 | 2017-01-04 | 99 | | 5 | 2017-01-05 | 145 | | 6 | 2017-01-06 | 1455 | | 7 | 2017-01-07 | 199 | | 8 | 2017-01-08 | 188 | +------+------------+-----------+ For the sample data above, the output is: +------+------------+-----------+ | id | date | people | +------+------------+-----------+ | 5 | 2017-01-05 | 145 | | 6 | 2017-01-06 | 1455 | | 7 | 2017-01-07 | 199 | | 8 | 2017-01-08 | 188 | +------+------------+-----------+
1. Query result set first
select id,date,people from stadium where people>=100;
2. Add an auto increment column to the result set of the query
SELECT @newid:=@newid+1 AS newid,test.* FROM(SELECT @newid:=0)r, test WHERE people>100
3. The difference between auto increment column and id is the same, i.e. continuous
SELECT @newid:=@newid+1 AS newid,test.* ,@cha:=id-@newid AS cha FROM(SELECT @newid:=0)r, test WHERE people>100
4. Put the same difference value in the same table, and take out the continuous quantity greater than 3
select if(count(id)>=3,count_concat(id),null)e from( SELECT @newid:=@newid+1 AS newid,test.* ,@cha:=id-@newid AS cha FROM(SELECT @newid:=0)r, test WHERE people>100) as d group by cha
5. Get the table from the previous step and the required main table
SELECT id,DATE,people FROM test, (SELECT IF (COUNT(id)>3,GROUP_CONCAT(id),NULL)e FROM (SELECT @newid:=@newid+1 AS newid,test.* ,@cha:=id-@newid AS cha FROM(SELECT @newid:=0)r, test WHERE people>100)AS d GROUP BY cha ) AS f WHERE f.e IS NOT NULL AND FIND_IN_SET(id,f.e);
It's said that it can be done with stored procedures, but I didn't try. I'll try later
Above