简体   繁体   中英

How to group subsequent rows (based on a criteria) and then count them [MySQL]?

Let's say I have such a table (ordered by date):

id | name | type  | date 
 1 | A    | 1     | 01-08-2012
 2 | A    | 2     | 01-08-2012
 3 | B    | 1     | 02-09-2012
 4 | A    | 1     | 01-10-2012
 5 | A    | 4     | 01-10-2012
 6 | A    | 5     | 02-10-2012

I want to group subsequent rows that have the same 'name' value and count them:

name | count 
A    | 2
B    | 1
A    | 3

I was thinking about writing a stored procedure and using cursors, but I was also wondering, if there's a simpler solution, for example using nested SELECTs, etc.

My question is very similar to: how to group array and count them , but that one concerns PHP.

To do that I used a couple of variables, the table structure, I created my own just for testing and it's:

create table abc (id int, name varchar(20),type int);

insert into abc values 
( 1 , 'A'    , 1  ),
( 2 , 'A'    , 2 ),
( 3 , 'B'    , 1  ),
( 4 , 'A'    , 1  ),
( 5 , 'A'    , 4  ),
( 6 , 'A'    , 5  )

the query ended being like this:

set @a:='';
set @counter:=1;
set @groupby:=0;
select *,count(REPEATED) from (select name,if(@a=name,@counter:=@counter+1,@counter:=1) as rep,if(@counter=1,@groupby:=@groupby+1,@groupby) as repeated,@a:=name type from abc) as t group by repeated

you can see it works in SQLFIDDLE if you have any question let me know.

In the SQLFIDDLE

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM