根据同一记录中的某个其他值更新记录值
update record value based on some other value in the same record
我的数据库中有以下 table:
CREATE TABLE `plans` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`plan` varchar(64) DEFAULT NULL,
`subscr_id` varchar(64) DEFAULT NULL,
`last_payment` timestamp NULL DEFAULT NULL,
`active` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=latin1
计划值为1 MONTH
、3 MONTHS
和YEAR
,分别对应1个月、3个月和12个月。
记录示例:
id----user_id-----plan--------subcr_id-------last_payment--------active
30 | 15 | 1 MONTH | A-1 | 2017-05-19 08:22:29 |1
如果 last_payment
发生在一个多月前(如果该记录的计划是 1M
),我想遍历每条记录并将 active
更新为 0,超过 3个月前(如果该记录的计划是 3 个月)
和超过 12 个月前(如果该记录的计划是 YEAR
)。
虽然我很喜欢table 简单的更新语句,但这个语句需要一些我不知道如何执行的 if 逻辑。你能帮帮我吗?
我认为你应该尝试这样的事情:
UPDATE plans t, (SELECT * FROM plans) t1
SET t.active = 0 WHERE date(now()) not between date_add(t1.last_payment,interval t1.plan month)
只需要将plan字段改成整数字段,或者interval(date),应该比做Case scenario简单,但你也可以:
UPDATE `plan` SET `active` = CASE
WHEN plan = '1 MONTH' THEN CAST(not between date_add(last_payment, interval 1 MONTH) AS SIGNED INTEGER);
WHEN plan = '3 MONTHS' THEN CAST(not between date_add(last_payment, interval 3 MONTH) AS SIGNED INTEGER);
WHEN plan = '1 YEAR' THEN CAST(not between date_add(last_payment, interval 1 YEAR) AS SIGNED INTEGER);
ELSE `1`
END
大概就是这样,希望对你有帮助
update plans set active = case
when plan = '1 MONTH' and last_payment < now() - interval 1 month then 0
when plan = '3 MONTH' and last_payment < now() - interval 3 month then 0
when plan = 'YEAR' and last_payment < now() - interval 1 year then 0
else 1
end;
我的数据库中有以下 table:
CREATE TABLE `plans` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`plan` varchar(64) DEFAULT NULL,
`subscr_id` varchar(64) DEFAULT NULL,
`last_payment` timestamp NULL DEFAULT NULL,
`active` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=latin1
计划值为1 MONTH
、3 MONTHS
和YEAR
,分别对应1个月、3个月和12个月。
记录示例:
id----user_id-----plan--------subcr_id-------last_payment--------active
30 | 15 | 1 MONTH | A-1 | 2017-05-19 08:22:29 |1
如果 last_payment
发生在一个多月前(如果该记录的计划是 1M
),我想遍历每条记录并将 active
更新为 0,超过 3个月前(如果该记录的计划是 3 个月)
和超过 12 个月前(如果该记录的计划是 YEAR
)。
虽然我很喜欢table 简单的更新语句,但这个语句需要一些我不知道如何执行的 if 逻辑。你能帮帮我吗?
我认为你应该尝试这样的事情:
UPDATE plans t, (SELECT * FROM plans) t1
SET t.active = 0 WHERE date(now()) not between date_add(t1.last_payment,interval t1.plan month)
只需要将plan字段改成整数字段,或者interval(date),应该比做Case scenario简单,但你也可以:
UPDATE `plan` SET `active` = CASE
WHEN plan = '1 MONTH' THEN CAST(not between date_add(last_payment, interval 1 MONTH) AS SIGNED INTEGER);
WHEN plan = '3 MONTHS' THEN CAST(not between date_add(last_payment, interval 3 MONTH) AS SIGNED INTEGER);
WHEN plan = '1 YEAR' THEN CAST(not between date_add(last_payment, interval 1 YEAR) AS SIGNED INTEGER);
ELSE `1`
END
大概就是这样,希望对你有帮助
update plans set active = case
when plan = '1 MONTH' and last_payment < now() - interval 1 month then 0
when plan = '3 MONTH' and last_payment < now() - interval 3 month then 0
when plan = 'YEAR' and last_payment < now() - interval 1 year then 0
else 1
end;