0

いくつかの列を持つテーブル T があり、そのうちの 1 つの列にはコンマ区切りの値があります。この列を処理し、次の方法ですべての行を更新したい

列には「15,20」などの値が含まれています。"30,15,50" (ソート順ではありません)。そして、可能な値は10個しかありません

処理ロジック

区切り文字 (,) に基づいて列を分割します。結果のリストで最大値を見つけます。最大値に基づいて、列を特定の値で更新します。

私はMysqlスクリプトを初めて使用します。ですので、解決方法を教えていただけると助かります

4

2 に答える 2

0

この男は、リストから最大数を選択します (このコードを mySQL UI のイミディエイト/クエリ ウィンドウまたはコマンド ラインから実行してテストできます)。

SET @foo = CONCAT('SELECT ', REPLACE('40,50,10,20', ',', ' UNION ALL SELECT '));
SET @foo = CONCAT('SELECT * FROM (', @foo, ' ORDER BY 1 DESC) AS uncleFoo LIMIT 1');
PREPARE STMT FROM @foo; 
EXECUTE STMT;
DEALLOCATE PREPARE STMT;

そう。最初の "SET @foo" は一種の展開関数です。リストから数値を選択してテーブルの行に入れる SQL を作成します。上記の例では、ご覧のとおり「40,50,10,20」と入力しましたが、「,」の代わりに任意の数の項目と任意の区切り記号を使用できます。
2 番目の「SET」行にコメントを付けてクエリを実行し、正確に何が起こるかを確認します。

次の "SET @foo" はクエリを拡張して、最大数のみが返されるようにします ("SELECT max([field])" のようなものですが、クエリの性質上、ここでは 'max' を使用できません)。 .
次に、クエリを実行して、リストから最大数のみを返すようにします。

結果でフィールドを更新したい場合は、次のようにクエリを拡張する必要があります。
UPDATE myTable SET myField=[value from above @foo execution] WHERE [your clause]

この時点から、特定のケースで必要なフィールドを更新する方法を簡単に理解できると思います。
何かを修正するために「1 回限りの実行」ではない場合、上記のコードを関数に移動することもできますが、後でこの更新も必要になります。

お役に立てれば!

于 2013-04-24T13:18:14.273 に答える