【问题标题】:How to group subsequent rows (based on a criteria) and then count them [MySQL]?如何对后续行进行分组(基于标准)然后对它们进行计数[MySQL]?
【发布时间】:2012-11-26 13:54:38
【问题描述】:

假设我有这样一张桌子(按日期排序):

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' 值的后续行分组并计数:

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

我正在考虑编写一个存储过程并使用游标,但我也想知道是否有更简单的解决方案,例如使用嵌套 SELECT 等。

我的问题与how to group array and count them 非常相似,但这个问题涉及 PHP。

【问题讨论】:

  • A | 2A | 3有什么区别?
  • "A | 2" 表示后面有 2 行 'name' 设置为 "A","A | 3" 表示后面有 3 行 'name' 设置为 "A" ";在它们之间有一行 name = "B"。

标签: mysql count group-by


【解决方案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:=@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

如果您有任何问题,请告诉我。

在 SQLFIDDLE 中

【讨论】:

  • 我喜欢它,现在我对我的问题有了新的看法,但是您的解决方案给出了错误的答案:查询说 B 是 2 倍并且不保持“名称”的顺序,所以,即使B的计数是正确的,我也不知道A是哪个。
  • 我发现 GROUP BY 有问题。它以这样一种方式对“内部组”进行排序,即 rep = 1 的行在每个组中排在第一位。
  • 请再试一次告诉我
  • 哦,现在可以了:)。但是我刚刚尝试了完全相同的方法并且失败了。我一定是弄错了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2018-06-21
相关资源
最近更新 更多