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
我需要一些帮助。
我知道了 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 |