MySQL 在同一个 table 中使用 if 评估进行更新

MySQL update with if evaluation in same table

我需要一些帮助。

我知道了 table:

---------
ID | N1 |
---------
a    100
b    150
c    90
d    240
--------

给定 2 个 ID(例如 a、b)我需要这样做:

If (a.n1 > b.n1) 
        
       a.n1 = b.n1
    
else 
        b.n1=a.n1;

如何在 MySQL 上完成?

DROP TABLE IF EXISTS T;

CREATE TABLE T
(D VARCHAR(1), N1 INT);
INSERT INTO T VALUES
('a'  ,  100),
('b'  ,  150),
('c'  ,  90),
('d'  ,  240);


SELECT T.D,(SELECT MAX(N1) MAXNI FROM T WHERE D IN('A','B')) N1
FROM  T WHERE D IN('A','B');

+------+------+
| D    | N1   |
+------+------+
| a    |  150 |
| b    |  150 |
+------+------+
2 rows in set (0.001 sec)

如果您想以这种方式更新 table,您可以使用存储过程:

CREATE TABLE T (ID VARCHAR(5), N1 INT);
DELIMITER $$
CREATE PROCEDURE check_vals (IN a VARCHAR(5), IN b VARCHAR(5)) BEGIN 
SET @a = (SELECT N1 FROM T WHERE ID = a); 
SET @b = (SELECT N1 FROM T WHERE ID = b); 
IF @a > @b THEN UPDATE T SET N1 = @b WHERE ID = a; 
ELSE UPDATE T SET N1 = @a WHERE ID = b; 
END IF; 
END $$
DELIMITER ;

那么就使用这样的程序:

CALL check_vals('a','b');
SELECT * FROM T;

Returns:

+----+-----+
| ID | N1  |
+----+-----+
| a  | 100 |
| b  | 100 |
| c  |  90 |
| d  | 240 |
+----+-----+

否则,如果您的目标只是操作 SELECT 结果中的数据,那么我会采用 P.Salmon 的答案。

您可以通过自连接来完成:

UPDATE tablename t1 
INNER JOIN tablename t2 
ON ('a', 'b') IN ((t1.ID, t2.ID), (t2.ID, t1.ID))
SET t1.N1 = LEAST(t1.N1, t2.N1)

尽管自连接将 return 2 行,但只会更新 1 行(或者 N1 中的 none 相等),因为 MySql如果原始值等于新值,则不会实际执行更新。

参见demo
结果:

ID N1
a 100
b 100
c 90
d 240