SELECT 并更新 MYSQL 5.7 中的值
SELECT AND UPDATE values in MYSQL 5.7
我有以下table..
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
SET is_active = 0
WHERE cid IN (SELECT cid FROM (
SELECT c1.cid FROM Coupons c1
INNER JOIN
(
SELECT partner, MIN(cid) AS min_cid
FROM Coupons
WHERE is_active = 1
GROUP BY partner
) c2 ON c2.partner = c1.partner AND c2.min_cid = c1.cid
WHERE c1.is_active = 1
) t );
这种方法是为每个合作伙伴停用一个记录,任意对应于每个合作伙伴组的最小 cid
值。
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)
。
I also wish to retrieve those records.. whose is_active is set to 0..
I need to write that stored proc..
可能是这样的(大概代码,想法而已):
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
我有以下table..
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
SET is_active = 0
WHERE cid IN (SELECT cid FROM (
SELECT c1.cid FROM Coupons c1
INNER JOIN
(
SELECT partner, MIN(cid) AS min_cid
FROM Coupons
WHERE is_active = 1
GROUP BY partner
) c2 ON c2.partner = c1.partner AND c2.min_cid = c1.cid
WHERE c1.is_active = 1
) t );
这种方法是为每个合作伙伴停用一个记录,任意对应于每个合作伙伴组的最小 cid
值。
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)
。
I also wish to retrieve those records.. whose is_active is set to 0..
I need to write that stored proc..
可能是这样的(大概代码,想法而已):
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