【问题标题】: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 的答案。

      【讨论】:

        猜你喜欢
        • 2014-09-06
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        • 2012-04-29
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        相关资源
        最近更新 更多