+ -
当前位置:首页 → 问答吧 → php执行sql原生语句的问题

php执行sql原生语句的问题

时间:2011-11-24

来源:互联网

现有数据库字段如下:
id -- pk
listID -- 所属书架ID
bookID -- 图书ID
sort -- 对书架里的书排序字段

表中数据如下:
id listID bookID sort
1 1 1 1
2 1 2 2
3 1 3 3
4 1 4 4

假如我删掉id=3
则sort字段变成1, 2, 4
想在删除时重新排序
使之成为1, 2, 3
又不想foreach循环更新数据库
所以用如下语句:

set @i:=0;
update table
set sort = (@i:=(@i+1))
where listID = 1

貌似不执行,想来问问大家有没有这种方法做过的
求告知。谢谢

作者: lzsadam   发布时间: 2011-11-24

当然不行,因为你的 id 是主键,主键是不能修改的

作者: xuzuning   发布时间: 2011-11-24

删掉listID = X的某个id之前,先获取sort值,执行删除,再将sort值更大的都-1

作者: amani11   发布时间: 2011-11-24

同楼上
UPDATE books set sortid=(sortid-1) WHERE id>3;

作者: leiyonglin   发布时间: 2011-11-24

同楼上 UPDATE books set sortid=(sortid-1) WHERE id>3;

主键情况。------------------------------
如果是主键要注意顺序就可以了。

比如有

4
5
6

如果从6开始减的话一定不行。5与5重复。要从4开始。
是加的话就得从6开始。
最好是先order by 一次再update

作者: ci1699   发布时间: 2011-11-24

SQL code

set @i:=0;
update table
set sort = (select @i:=@i+1)
where listID = 1

作者: ZT_King   发布时间: 2011-11-24

引用 1 楼 xuzuning 的回复:

当然不行,因为你的 id 是主键,主键是不能修改的


sorry,怪我没说清楚
我在删除后只想对sort字段排序
不管ID是多少

作者: lzsadam   发布时间: 2011-11-24

引用 2 楼 amani11 的回复:

删掉listID = X的某个id之前,先获取sort值,执行删除,再将sort值更大的都-1


引用 3 楼 leiyonglin 的回复:

同楼上
UPDATE books set sortid=(sortid-1) WHERE id>3;


引用 4 楼 ci1699 的回复:

同楼上 UPDATE books set sortid=(sortid-1) WHERE id>3;

主键情况。------------------------------
如果是主键要注意顺序就可以了。

比如有

4
5
6

如果从6开始减的话一定不行。5与5重复。要从4开始。
是加的话就得从6开始。
最好是先order by 一次再update


2,3,4楼的朋友,谢谢你们的回答
这是一个折中取巧的办法
不适用更复杂的情况,我只是举了个简单的例子

作者: lzsadam   发布时间: 2011-11-24

引用 5 楼 zt_king 的回复:

SQL code

set @i:=0;
update table
set sort = (select @i:=@i+1)
where listID = 1


5楼的朋友,我照你的方法试过了
不行。
我用的框架是thinkphp
用的是thinkphp里面的execute方法

作者: lzsadam   发布时间: 2011-11-24

mysql Ver 14.14 Distrib 5.1.41, for Win32(ia32)
下测试过并正确执行的SQL.

作者: ZT_King   发布时间: 2011-11-24

相关阅读 更多