-3

テーブルに多くの列があり、いくつかの値と照合する必要があり、一致するものが見つかった場合は値を置き換える必要があります。

したがって、基本的には、列名を一種の変数として受け取り、テーブルをループして、一致した場合は列の値を更新するクエリを探しています。

私はphpでそれを行うことができ、列と同じ数のクエリを持っています。しかし、それは私が望まないことです。

ps私はそれが悪い設計であることを知っています、そして通常の場合、そのような要件は決して起こりません、しかし悲しいことにそれはそれが何であるかです。

4

5 に答える 5

6

多くのステートメントで:

UPDATE tableX 
SET   col_1 = 'newvalue' 
WHERE col_1 = 'ram';

UPDATE tableX 
SET   col_2 = 'newvalue' 
WHERE col_2 = 'ram';

...

UPDATE tableX 
SET   col_N = 'newvalue' 
WHERE col_N = 'ram';

一言で

UPDATE tableX 
SET   col_1 = CASE WHEN col_1 = 'ram'
                     THEN 'newvalue' 
                     ELSE col_1 
              END
    , col_2 = CASE WHEN col_2 = 'ram'
                     THEN 'newvalue' 
                     ELSE col_2 
              END
    ...

    , col_N = CASE WHEN col_N = 'ram'
                     THEN 'newvalue' 
                     ELSE col_N 
              END
 ;

手動または動的SQLを使用してステートメントを記述できます(機能する列とテーブルが多すぎる場合)。

于 2012-04-20T12:16:02.860 に答える
2

これは別の間違った質問であり、文字通りの答えは役に立たないでしょう。

このようなループが必要な場合は、データベースの設定が間違いなく間違っています。

列には、他の列間で共有されない、個別の値が含まれている必要があります。

ある種の1対多の関係を実装しようとしている場合は、これらの2つの列を別のテーブルの列に移動する必要があります。

于 2012-04-20T12:30:45.890 に答える
1
UPDATE tablename SET columnname = 'newvalue' WHERE columnname = 'currentvalue';

アップデート

このPHPスクリプトは、各列名を調べてクエリを適用します

<?php
$result = mysql_query("SHOW COLUMNS FROM tablename ");
while ($row = mysql_fetch_assoc($result)) {
    mysql_query("UPDATE tablename SET ".$row['field']." = 'newvalue' WHERE ".$row['field']." = 'currentvalue'");
}
?>
于 2012-04-20T12:08:09.760 に答える
0

http://dev.mysql.com/doc/refman/5.5/en/show-table-status.html

そのSHOWTABLESTATUS ...コマンドを使用してphpのテーブル構造を取得し、その結果から1つの更新コマンドを作成して、変更する一致データですべての列を更新できます。

SHOW TABLE STATUSLIKE...またはSHOWTABLESTATUS WHERE name = ..を使用して、必要なテーブルを取得することができます。

于 2012-04-20T12:16:10.443 に答える
0

PHPで作成し、列の配列、フォームの値のペアを作成しますcolumn=value。1つは古い値用、もう1つは新しい値用です。次に、この配列を分解して、クエリが次のようになるようにします。

"UPDATE table SET ".explode(',', $newvalues)." WHERE ".explode(' AND ', $oldarray)
于 2012-04-20T12:23:26.327 に答える