0

所以在这段代码中,我只是从表中删除了一行,所以 img_pos 的值是:1,2,3,4,5 现在,它们是(假设我们删除了第三个条目):1, 2,4,5 当然,我希望是:1,2,3,4

所以我必须批量重命名行。

我得到了这个,但似乎没有工作......

$sql = "SELECT * FROM $tableImg WHERE img_acc = $accid ORDER BY img_pos";
$res = mysql_query($sql);
$num = mysql_num_rows($res);

$i = 0;
$n = 1;
while($i<$num){
    $sql = "SELECT * FROM $tableImg WHERE img_acc = $accid ORDER BY img_pos DESC LIMIT $i,1";
    $res = mysql_query($sql);
    $row = mysql_fetch_array($res);
    $img_pos = $row['img_pos'];

    $sql = "UPDATE $tableImg SET img_pos = '$n' WHERE img_acc = '$accid' AND img_pos = '$img_pos'";
    $res = mysql_query($sql);
    $i++;
    $n++;
}
mysql_close();

$tableImg 只是一个包含表名的变量,它工作得很好。我猜问题出在“$img_pos = $row['img_pos'];”附近的某个地方,因为所有查询都在不同的地方使用,即使略有不同,它们应该可以工作......

提前致谢!

4

2 回答 2

1

我最终只是这样做:

$i = 1; 
while($row = mysql_fetch_array($res)){
    $old_pos = $row['img_pos'];
    $sql = "UPDATE $tableImg SET img_pos = $i WHERE img_acc = $accid AND img_pos = $old_pos";
    $res = mysql_query($sql);
    $i++;
};
于 2013-06-14T15:35:58.770 回答
0

这是很有可能的,只是完全没有必要。数字数据的好处是你不必看它,所以它是否有点不合时宜,不是吗?

如果您真的想这样做(例如,您正在构建一个应用程序,并且您只是在清理您在处理它时删除的内容),那么下面的示例将在 SQL 中执行,正如这个简单的示例所示:

CREATE TABLE disorder (id int,stuff CHAR(6));
CREATE TABLE disorder2 (id SERIAL,stuff CHAR(6));
INSERT INTO disorder (id,stuff)
VALUES
('1','ONE'),
('2','TWO'),
('3','THREE'),
('4','FOUR'),
('5','FIVE');
DELETE FROM disorder WHERE id='3';


INSERT INTO disorder2 (stuff) SELECT stuff FROM disorder;
TRUNCATE TABLE disorder;
INSERT INTO disorder SELECT * from disorder2;
DROP TABLE disorder2;

这可以在sqlfiddle上看到,但这很明显。如果您从无序中执行 SELECT *,您会明白为什么您可能不应该做这种事情。

你的表确实需要有主键。这加快了搜索/索引并使其有用。查阅数据库范式以全面讨论推理。

于 2013-06-13T11:44:46.060 回答