2017-08-06 24 views
0

我在寫一個查詢,根據它們的當前值更新行。
我檢查的其中一個條件是「如果我正在更新的特定行有一列是表中具有4個相同行值的其他行中的最低值」。知道一行是否具有最低的列?

所以..例如,我的表結構如下所示:

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

我想知道如果我UPDATE -ing行是一個具有最低lookup值的所有其他行匹配相同的option1,option2,option3option4值。

我怎麼能在一個查詢中實現這樣的事情?我試圖最大限度地減少查詢並最大限度地利用單個查詢,所以我無法使用我的前端。我可以使用子查詢,並且查詢的字符限制是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中實現。

+0

樣本數據和期望結果集會幫助很多。 – lad2025

+0

也是你試過的查詢 –

+0

@ lad2025 @Harish Barma - 我添加了示例數據和示例查詢。我不知道我是否需要像SELECT這樣的結果集,所以我不知道我該怎麼做。 – shavit

回答

1

您可以使用joingroup by

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'; 

編輯:

如果你想設置LOWESTNOT LOWEST,使用LEFT JOIN

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

相關問題