2012-11-26 61 views
2

比方說,我有這樣的(按日期排序)的表:如何將後續行分組(根據標準),然後對它們進行計數[MySQL]?

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 

我想有相同「名稱」值並計數組後續行:

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

我在想關於編寫一個存儲過程和使用遊標,但我也想知道,如果有一個更簡單的解決方案,例如使用嵌套SELECTs等。

我的問題非常類似於:how to group array and count them,但那個涉及PHP。

+0

'A |之間的區別是什麼? 2'和'A | 3'? – jcho360

+0

「A | 2」表示後面有兩行,'name'設置爲'A','A | 3'表示後面3行的'name'設置爲「A」;在它們之間有一行,名稱=「B」。 –

回答

1

要做到這一點我用了幾個變量, 表結構,我創造了我自己只是用於測試,它是:

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 ) 

查詢結束是這樣的:

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

你可以看到它在SQLFIDDLE有效,如果你有任何問題讓我知道。

在SQLFIDDLE中

+0

我喜歡它,現在我對我的問題有了新的看法,但是您的解決方案給出了錯誤的答案:查詢說B是2次,並且不保留'name'的順序,所以即使B的計數是正確的,我不知道哪個是哪個。 –

+0

我想通了,問題在於GROUP BY。它以這種方式命令「內部組」,rep = 1的行首先在每個組中排列。 –

+0

請再試一次讓我知道 – jcho360

相關問題