我正在使用MySQL数据库创建一个简单的PHP网页。 MYSQL数据库具有以下内容:(左图) 我只是想知道一种可能的方法来做一些数据操作,以便在下面的右边部分获得结果。
(initial value) (final result)
ID | MINUS '1'(to "next" ID's) ID | ID |
1 | 0 1 | ------------> 1 |
2 | 1 --> (will minus '1' to ID 3 2 | ------------> 2 |
3 | 0 up to the last) 3-1 = 2 | ------------> 2 |
4 | 0 4-1 = 3 | ------------> 3 |
5 | 1 --> (minus '1' AGAIN to ID 6 5-1 = 4 | ------------> 4 |
6 | 0 up to the last) 6-1 = 5 -1 ---> 4 |
7 | 0 7-1 = 6 -1 ---> 5 |
它只是计算减号的数量,然后将其减去所有跟随它的ID。 ID 2告诉下一个ID,即3将其自身减去1直到最后一个ID(3-1,4-1,5-1,6-1,7-1),但另一个实例来了。 ID 5告诉ID 6再次减去自己到最后一个,所以从ID 6到最后一个ID减去2。从6-1,7-1 ---> 6-2,7-2。
我知道这听起来很容易,但我只是一个新手并且很难找到这件事。对不起头疼。希望有人帮忙,谢谢!
我的DML就像(仅用于说明,这应该是在php中,我会转换它,只是帮助我在LOGIC中)
for($x=0;$x<num_rows;$x++)
{
if(MINUS = 1){
query(UPDATE table_name SET ID=ID-1 WHERE ID = $x);}
}
这样的事情,我仍然是决策循环的新手。如果你能解决我的循环,我将不胜感激。我是这个社区的新手,我求你理解。
答案 0 :(得分:1)
您可以使用变量或标准SQL在MySQL中执行此操作。这是标准的SQL:
select id, minus,
(id - coalesce((select sum(minus) from table t2 where t2.id < t.id), 0)) as newId
from table t;
这是变量版本:
select id, minus,
(id - minus + (@value := @value + minus)) as newId
from table t cross join
(select @value = 0) const
order by id
答案 1 :(得分:0)
您可以按如下方式使用MySQL实现:
select id, minus,
(id - coalesce((select sum(minus) from table t2 where t2.id < t.id), 0)) as newId
来自表t;
代码的想法来自戈登的帖子,这里有一个阐述。
第一部分是select
,它表示你想从mysql中选择某些输入。 id, minus
跟随,表示您希望在查询运行完毕后返回id
和minus
的值。
其余部分属于第三部分,执行减法,并将减法的值作为newId返回。因此,当sql返回时,它将获得一行ID,MINUS和NEWID作为它的标题。
减法的工作原理如下:coalesce返回列表中的第一个非空值(即1
)。 table t2
正在使用该表的第二个版本并将其调用为t2,以便您可以比较信息。
我希望这能为你澄清一些事情!