簡體   English   中英

SELECT 和更新 MYSQL 5.7 中的值

[英]SELECT AND UPDATE values in 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 值,這意味着“活動” state (太)然后使用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

你可以試試:

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值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM