2017-08-06 13 views
0

現在の値に従って行を更新するクエリを作成しています。 「私は更新だ特定の行が4つの同一の行の値と他の行のうちテーブルにおける最小値であるつの列を持っている場合、」私は確認していた条件の
一つです。行の列が最も低いかどうかを知る?

..だから例えば、私のテーブル構造はそうのようなものです:

INTEGER id - PRIMARY KEY 
FLOAT lookup 
VARCHAR(128) option1 
INTEGER option2 
INTEGER option3 
INTEGER option4 

は私がUPDATE -ingだ行は、他のすべての行のうち、最も低いlookup値を有するものであるかどうかを知りたいですそれは同じoption1option2option3option4値と一致します。

どのように私は、単一のクエリでそのようなことを実現するだろうか?私は、クエリを最小限に抑え、単一のクエリを最大限に活用しようとしているので、私はこのために私のフロントエンドを使用することはできません。私はサブクエリを使用することができ、クエリの文字制限は8192文字です。

編集:
サンプル行:

id | lookup | option1 | option2 | option3 | option4 
1 | 1.000 | "a"  | 2  | 1  | 4 
2 | 1.100 | "a"  | 1  | 1  | 2 
3 | 1.200 | "a"  | 1  | 1  | 1 
4 | 1.250 | "a"  | 1  | 1  | 1 
5 | 1.300 | "a"  | 1  | 1  | 1 

私が行うことにしたいクエリ:

UPDATE table SET option2 = IF_LOWEST_IN_TABLE(lookup)? LOWEST:NOT_LOWEST WHERE option1 = "a"; 

LOWEST部分は、id 1の行のために起こる2と3の必要がありますIF_LOWEST_IN_TABLEと私はそれがSQLで実装する必要があるかわからないので、三項演算子は "プレースホルダ"です。

あなたが joingroup by使用することができます
+0

サンプルデータと希望結果セットは大いに役立ちます。 – lad2025

+0

また、クエリは、あなたはlad2025 @Harish Barma @ –

+0

を試してみました - 私は、サンプルデータとサンプルクエリを追加しました。私は 'SELECT'のような結果セットが必要かどうかわからないので、私は何をすべきか分かりません。 – shavit

答えて

1

:あなたはLEFT JOINを使用し、LOWESTNOT LOWESTを設定したい場合は

UPDATE table t JOIN 
     (SELECT min(id) as minid, option1, option2, option3, option4 
     FROM t 
     GROUP BY option1, option2, option3, option4 
     ) tt 
     ON t.id = tt.minid 
    SET t.option2 = LOWEST 
    WHERE option1 = 'a'; 

EDITを

UPDATE table t LEFT JOIN 
     (SELECT min(id) as minid, option1, option2, option3, option4 
     FROM t 
     GROUP BY option1, option2, option3, option4 
     ) tt 
     ON t.id = tt.minid 
    SET t.option2 = (CASE WHEN tt.minid IS NOT NULL THEN LOWEST ELSE NOT_LOWEST END) 
    WHERE option1 = 'a'; 
+0

どうすれば "三項演算子"( 'else')の反対側を実行できますか?私の例では、 'NOT_LOWEST'のように。 – shavit

関連する問題