Mysql计算匹配的连续行

时间:2013-10-23 12:31:12

标签: mysql count

我正在尝试运行MySQL查询但不太确定如何执行此操作。我想计算匹配的连续行数。例如

A A A B B B B A A

我希望结果为3

很容易计算A的总数,但我不确定仅仅是最近的3个。

以下是我如何列出所有

的示例
SELECT email,subject FROM tablename where email='test@example.com' and subject='FAIL';

编辑:以下是一些可能有用的示例数据。为简单起见,我们将只有ID

的ID和主题及订单
ID Subject
1 FAIL
2 FAIL
3 FAIL
4 PASS
5 PASS
6 FAIL
7 PASS
8 FAIL
9 FAIL

结果应为3或2,具体取决于您订购ID

的方式

3 个答案:

答案 0 :(得分:3)

我在这里加载了一个SQLfiddle:http://sqlfiddle.com/#!2/5349a/1但是,在您的示例数据中,您有两个ID = 5。我让它独一无二。此外,我的SQLFiddle数据不再与您的匹配,因为我更改了一些值以确保它有效。玩得开心:)(这可以查看序列的最大ID值)

试试这个:

SELECT COUNT(*)
FROM (
  SELECT Subject, MAX(ID) AS idlimit
  FROM t
  GROUP BY Subject
  ORDER BY MAX(ID) DESC
  LIMIT 1,1) as Temp
JOIN t
  ON Temp.idlimit < t.id

答案 1 :(得分:2)

您可以使用以下方式。我们所需要的只是计算值的变化,例如:其中当前值不等于前一个。在这个例子中,ID是一个订单字段,它可以是id,date,....

select count(*)+1
FROM T T1
where val<>(select val from T where T.id<T1.id order by id desc LIMIT 1)

count(*)+1因为第一个序列没有先前的值。

SQLFiddle demo

如果只需要计算超过1个值的序列,则可以使用以下语句。这里HAVING count(*)>1意味着我们只需要来自行中2个或更多值的序列。如果您需要3个或更多,请将其更改为HAVING count(*)>2,依此类推。

select count(*)

FROM
(
select Val,Grp
from
(
select
T1.id,T1.val,
(select max(id) from T where T.id<T1.id
                             and T.val<>T1.Val ) as Grp
FROM T T1
) T1
group by GRP HAVING count(*)>1
) T3

SQLFiddle demo

答案 2 :(得分:1)

这只是一个简单的技巧,如果您找到第一个非faildata id,您可以轻松计算连续传球。

SELECT count(*)FROM(SELECT ID FROM tablename where subject!=&#39; FAIL&#39; limit 1)作为临时连接tablename on temp.ID&gt; tablename.ID