我正在写一个查询,根据其当前值更新行。
我要检查的条件之一是“如果我要更新的特定行的其他列中具有4个相同的行值,则该列中的最小值是表中的最低值”。
因此,例如,我的表结构如下:
INTEGER id - PRIMARY KEY
FLOAT lookup
VARCHAR(128) option1
INTEGER option2
INTEGER option3
INTEGER option4
我想知道我正在打
UPDATE
的行是否是与相同的lookup
,option1
,option2
和option3
值匹配的所有其他行中具有最低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中实现它。 最佳答案
您可以使用join
和group 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';
编辑:
如果要设置
LOWEST
和NOT 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/