我在 mysql 数据库中有一个图像表,其中包含以下字段
id int primary key
type_id int
product_id int
source varchar
created timestamp
expiry timestamp
active tinyint
我需要做的是设置 1 张图片处于事件状态 ( active=1
),其中 product_id
、source
和 type_id
是相同的,应该设置为事件的应该是具有最新创建时间戳的那个,如果我有 2 个具有相同时间戳的,我需要具有最高 id 设置事件且到期的那个应该是 > CURRENT_DATE
,具有相同product_id、source 和 type_id 的所有其他人应将 active 设置为 0。对于所有product_id、source 和 type_id 相同的情况都应执行此操作。
这可以用 1 个 SQL 完成吗?
最佳答案
对于 MySql 8.0+,您可以使用 ROW_NUMBER()
返回 active
必须更新为 1
和 LEFT 的行
在 UPDATE
语句中加入表:
update tablename t left join (
select t.*
from (
select *,
row_number() over (partition by product_id, source, type_id order by created desc, id desc) rn
from tablename
where (product_id = source) and (product_id = type_id) and (expiry > currrent_date)
) t
where t.rn = 1
) tt on tt.id = t.id
set t.active = (tt.id is not null)
关于当满足要求时,Mysql将 bool 值设置为1,所有其他要求设置为0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58996084/