Mysql 如何在此id之前计算总id?

Mysql 如何在此id之前计算总id?,mysql,sql,Mysql,Sql,我想在我的id之前计算总数据id。例如,现在我发送的id是7,我想在id 7之前计算状态为4的id,但如果状态为=4.别再数数了。如何修复它 id | status| ------------ 1 | 4 | 2 | 1 | 3 | 2 | 4 | 2 | 5 | 4 |---> GET THIS DATA 6 | 4 |---> GET THIS DATA 7 | 0 |--> MY ID 8 |

我想在我的id之前计算总数据id。例如,现在我发送的id是7,我想在id 7之前计算状态为4的id,但如果状态为=4.别再数数了。如何修复它

id | status|
------------    
 1 |   4   |
 2 |   1   |
 3 |   2   |
 4 |   2   |
 5 |   4   |---> GET THIS DATA
 6 |   4   |---> GET THIS DATA
 7 |   0   |--> MY ID
 8 |   0   |
 9 |   0   |
这是我的代码:

SELECT (SELECT COUNT(id) FROM `table_cicilan` WHERE `status` = '4' AND id < '7') AS `position` FROM `table_cicilan` WHERE `status` = '4' AND id='7' AND kode_cicilan='CICIL1' 

谢谢,规格不完全清楚。但如果我的ID值为7,并查找ID值前面的状态为4的行,我们希望返回这些行的计数,那么我们可以执行如下操作:

SELECT COUNT(*) AS cnt
  FROM t
 WHERE t.id  <  7                                         /* <-- MY ID -- */
   AND t.id  > IFNULL( ( SELECT b.id
                           FROM t b
                          WHERE NOT ( b.status <=> 4 )
                            AND b.id  <  7                /* <-- MY ID -- */
                          ORDER BY b.id DESC
                          LIMIT 1
                        )
              ,POWER(-2,63)
              )
该查询考虑了id为允许负值的大整数和允许状态为空值的可能性。如果我们知道id是无符号的,或者status是非NULL的,那么查询可以简化一点

此答案中的查询满足规范的一种可能解释。还可以修改选择列表以返回实际行,而不是计数,或者返回最小id值,等等

注意:如果status值4不是用户提供的值,而我们需要的是前一行status列的值,那么我们可以更改查询来实现这一点


但是,如果问题指定了一个显式值4,并且没有提到检查前一行以获取该行上状态列的值,那么演示SQL执行指定值4以外的操作似乎为时过早。

这里是最简单的解决方案。。。不需要检查空值,因为OP没有指定。。。如果要检查空值,请使用spencer代码

 SELECT COUNT(*) AS total_count
      FROM table_cicilan
     WHERE table_cicilan.id  >  IFNULL(( SELECT tc.id
                               FROM table_cicilan tc
                              WHERE tc.status != 4 
                                AND tc.id  <  7               
                              ORDER BY tc.id DESC
                              LIMIT 1
                            ),-1)
           AND   table_cicilan.id  <  7
下面是代码的解释

我们在这里所做的只是在小于7的行中选择状态不等于4的行,然后计算这些行的数量。。。 所以你得到的逻辑意味着你也可以用between操作符? 是的,您可以这样做,但您需要从表中删除上限和下限行计数,因此我要减去2个值,但这不是正确的方法,因为您需要检查计数>0,因为假设未找到任何记录,那么由于减法,计数将为-2

SELECT IF((COUNT(*)-2) >0,(COUNT(*)-2),0) AS total_count
  FROM table_cicilan
 WHERE table_cicilan.id  between  IFNULL(( SELECT tc.id
                           FROM table_cicilan tc
                          WHERE tc.status != 4 
                            AND tc.id  <  7               
                          ORDER BY tc.id DESC
                          LIMIT 1
                        ),-1)
       AND 7

到目前为止我们能看到你的代码吗?id=1怎么样?你选择了MySQLi还是PDO?好的,我代表MarkOverton回答:你的代码是否有效并不重要。如果是的话,你就不会问这个问题了。我们需要代码来查看出了什么问题,这样我们才能真正帮助您。否则,我们将不得不为您提供一个现成的解决方案,该解决方案可能与您现有的解决方案不符。不,限制为1,因为OP希望在最近的记录下方具有相同状态的行。如果@user3783243是这种情况,那么他的问题描述和ascii表描述-->获取此数据是矛盾的。我不理解问题和预期结果。我确信更多的人在阅读此问题和评论时也不理解此问题。。Topcistarter请参见@spencer7593,如果子查询表达式为空,为什么返回POWER-2,63?@SayedMohdAli:好问题。如果ID是无符号整数,那么我们可以只返回-1或0,考虑当ID 7之前的所有行都是状态4、1、4、2、4、3、4、4、4、5、4、6、4、7、0、…根据规范,我们希望返回6的计数。试图获取状态不是4的前一行的子查询将找不到行,并返回NULL。条件是检查非4状态行之后的行,当我们得到NULL时,我们可以指定一个低于最低可能id值的值,对于BIGINT数据类型,该值为-2^63。好的,我已经对您的答案进行了投票。。。并且理解了逻辑。。。但在这种情况下,我们也可以返回总计数。。。如果7之前的所有值都是4,并且我们无法找到7之前的非4状态值,但是如何找到7之前的所有行都是4…@SayedMohdAli:对,如果子查询返回NULL,我们希望从WHERE子句中删除该条件。也许我们可以做一个OR条件,然后再次运行该子查询,看看它是否为NULL,这很难看。也许我们可以对子查询进行ix。但是我们如何让它返回一个比表中存在的任何id都低的id值呢?快速修复方法是只测试NULL并用零替换它。哦,但是如果id可以是零呢。我们可以返回-1。哦,但是如果id可以是负数,如果id是BIGINT呢,这就是我得到IFNULL的原因,POWER-2,63被授予了一个角落案例,在最极端的角落案例中,我们的状态=4,一直回到POWER-2,63的最低可能id值,我同意计数只差一行,缺少第一行,由于比较,也考虑了每一行的边缘情况。id@spencer7593检查null并返回-1也可以解决这个问题。。。如果ID是正整数,这是好的解决方案还是坏的解决方案?是的,这似乎足以处理前面所有行的状态=4边缘情况。@spencer7593是的,我尝试用另一个查询解决空情况 我已经给出了中间选择。。。如果我尝试-1或幂-2,63,在这两种情况下都会给出错误的输出。。。