首页 > 解决方案 > MYSQL 5.7 中的选择和更新值

问题描述

我有下表..

CREATE TABLE Coupons (
    cid INT(11) PRIMARY KEY,
    coupon_name  VARCHAR(255),
    partner     VARCHAR(255),
    is_active   INT(1)
);
INSERT INTO `table_name`(cid,coupon_name,partner_name,is_active) VALUES (0,'SWIGGYONE','SWIGGY',1);
INSERT INTO `table_name`(cid,coupon_name,partner_name,is_active) VALUES (1,'ZOMATOONE','ZOMATO',1);
INSERT INTO `table_name`(cid,coupon_name,partner_name,is_active) VALUES (2,'SWIGGYONE','SWIGGY',1);
INSERT INTO `table_name`(cid,coupon_name,partner_name,is_active) VALUES (3,'ZOMATOTWO','ZOMATO',1);

我希望从每个合作伙伴那里获取一张 ACTIVE 优惠券并将其 is_active col 更新为 0。

有什么建议么?我正在使用 MYSQL 5.7

编辑:

我也希望获取那些is_active设置为 0 的记录。

我对 MYSQL 5.7 中使用的事务或 @variables 没有足够的知识

标签: mysqlmysql-5.7

解决方案


UPDATE Coupons AS updated_table_copy
  JOIN ( SELECT partner, ANY_VALUE(cid) cid 
         FROM Coupons
         WHERE is_active
         GROUP BY partner ) AS what_rows_to_update USING (partner, cid)
SET updated_table_copy.is_active = 0;

如果您想更新一些确定的优惠券,请使用MIN()/MAX()而不是ANY_VALUE().

如果is_active可能有 NULL 值,这意味着“活动”状态(太)然后使用WHERE COALESCE(is_active, 1).


我还希望检索那些记录..其 is_active 设置为 0..

我需要写那个存储过程..

它可能是这样的(近似代码,仅供参考):

CREATE PROCEDURE update_coupon_table
BEGIN
    SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    CREATE TEMPORARY TABLE tmp (cid INT) ENGINE = Memory;
    START TRANSACTION;
        INSERT INTO tmp (cid)
            SELECT MIN(cid)
            FROM Coupons
            GROUP BY partner;
        UPDATE Coupons
            JOIN tmp USING (cid)
            SET Coupons.is_active = 0;
    COMMIT;
    SELECT Coupons.*
        FROM Coupons
        JOIN tmp USING (cid);
    DROP TEMPORARY TABLE tmp;
END

推荐阅读