Mysql 如何在此id之前计算总id?
我想在我的id之前计算总数据id。例如,现在我发送的id是7,我想在id 7之前计算状态为4的id,但如果状态为=4.别再数数了。如何修复它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 | 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,在这两种情况下都会给出错误的输出。。。