2017-08-06 36 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

相关问题