0

このコードでは、テーブルから行を 1 行削除したので、img_pos の値は 1,2,3,4,5 となりました (3 番目のエントリを削除したと仮定して): 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 に答える