【问题标题】:MySql: Counting rows until value changesMySql:计数行直到值更改
【发布时间】:2016-01-09 11:14:00
【问题描述】:

我知道如何计算具有特定值的行数,但是如何计算行数直到该值发生变化?

例如:

1 cat
2 cat
3 cat
4 dog
5 dog
6 cat
7 cat

如果不计算最后两只猫,我如何计算前三只猫?

【问题讨论】:

    标签: mysql sql counting


    【解决方案1】:

    您可以找到第一个不是猫的事物的 id 并计算小于该值的 id:

    select count(*)
    from t
    where id < (select min(t2.id) from t t2 where t2.value <> 'cat');
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      SELECT @val := 1;
      SELECT COUNT(IF(@val = 1 AND animal = 'cat', @val := 1, @val := NULL)) cnt FROM animals;
      

      这是做什么的:

      • 将变量 @val 初始化为 1。
      • 对于匹配 if 条件的每一行,返回 1;否则返回 NULL。
      • 计算(非 NULL)行数。

      这将为您提供所需的计数。如果您需要行的实际值,可以执行以下操作:

      SELECT @val := 1;
      SELECT * FROM (
              SELECT id, animal, IF(@val = 1 AND animal = 'cat', @val := 1, @val := NULL) ok FROM animals
          ) _animals WHERE ok = 1;
      

      if 语句的作用是,只要 @val = 1(初始条件)并且您正在看一只猫,将 @val 设置为 1 并返回 1。一旦动物不再是猫, @val 变为 NULL,这意味着所有未来的行也将返回 NULL(因为 @val 将不再为 1)。

      【讨论】:

        猜你喜欢
        • 2021-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-29
        • 1970-01-01
        • 2016-05-14
        • 1970-01-01
        • 2016-02-27
        相关资源
        最近更新 更多