mysql - 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 没有足够的知识
解决方案
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
推荐阅读
- phpstorm - 来自 Docker 的 Xdebug 突然停止在 PhpStorm 中工作
- java - 将 Spring Boot 从 2.1.1 升级到 2.2.10 后找不到父键
- ms-word - Word:单击时自动选择文本块
- wordpress - 将 WordPress 站点复制到子域上的临时站点上
- hyperledger-fabric - 如何更改 ca-server HLF 上的附属名称?
- docker - 如何使用 docker-compose 创建反向绑定卷?
- visual-studio - Visual Studio 等效于 GDB 的替代路径(调试符号的重定向源位置)
- python - Chromedriver 测试在本地和 CI CD env python 上工作
- c# - IEnumerable
.ToList() 失败并出现错误“对象引用未设置为对象的实例”但对象不为空 - imagemagick - Imagemagick 将灰度图像转换为彩色