ВЫБРАТЬ И ОБНОВИТЬ значения в MYSQL 5.7 - PullRequest
0 голосов
/ 09 июля 2020

У меня есть таблица ниже ..

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);

Я sh, чтобы получить по одному АКТИВНОМУ купону от каждого партнера и обновить его is_active col до 0.

Есть предложения? Я использую MYSQL 5.7

EDIT:

I wi sh, чтобы получить и те записи, для которых is_active установлено значение 0.

Мне не хватает знание транзакций или @variables, используемых в MYSQL 5.7

Ответы [ 2 ]

4 голосов
/ 09 июля 2020
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).

Я также использую sh для извлечения тех записей .. чей is_active установлен в 0 ..

Мне нужно написать этот сохраненный pro c ..

Это может быть что-то вроде этого (примерный код, только идея):

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
1 голос
/ 09 июля 2020

Вы можете попробовать:

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 значению для каждой группы партнеров.

...