【问题标题】:MySQL update with if evaluation in same tableMySQL 在同一个表中使用 if 评估更新
【发布时间】:2021-02-05 15:33:02
【问题描述】:
我需要一些帮助。
我得到了这张桌子:
---------
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 上做到这一点?
【问题讨论】:
标签:
mysql
sql-update
case
【解决方案1】:
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)
【解决方案2】:
您可以通过自加入来做到这一点:
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)
虽然自连接会返回2行,但只有1行会被更新(或者N1s都不相等),因为如果原始值等于新值,MySql实际上不会执行更新。
请参阅demo。
结果:
| ID |
N1 |
| a |
100 |
| b |
100 |
| c |
90 |
| d |
240 |
【解决方案3】:
如果您想以这种方式更新表,您可以使用存储过程:
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;
返回:
+----+-----+
| ID | N1 |
+----+-----+
| a | 100 |
| b | 100 |
| c | 90 |
| d | 240 |
+----+-----+
否则,如果您的目标是只操作 SELECT 结果中的数据,那么我会选择 P.Salmon 的答案。