我正在写一个查询,根据其当前值更新行。
我要检查的条件之一是“如果我要更新的特定行的其他列中具有4个相同的行值,则该列中的最小值是表中的最低值”。

因此,例如,我的表结构如下:

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


我想知道我正在打UPDATE的行是否是与相同的lookupoption1option2option3值匹配的所有其他行中具有最低option4值的行。

如何在单个查询中实现这样的事情?我试图最小化查询并从单个查询中获得最大收益,所以我不能为此使用前端。我可以使用子查询,查询的字符数限制为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

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

关于mysql - 知道一行是否具有最低的列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45533853/

10-16 15:23