我有下表..
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);
Run Code Online (Sandbox Code Playgroud)
我希望从每个合作伙伴那里获取一张 ACTIVE 优惠券并将其 is_active col 更新为 0。
有什么建议?我正在使用 MYSQL 5.7
编辑:
我也希望获取那些is_active设置为 0 的记录。
我对 MYSQL 5.7 中使用的事务或 @variables 没有足够的了解
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;
Run Code Online (Sandbox Code Playgroud)
如果您想更新某些特定优惠券,请使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |