当满足要求时,Mysql将 bool 值设置为1,所有其他要求设置为0

标签 mysql sql

我在 mysql 数据库中有一个图像表,其中包含以下字段

id         int primary key 
type_id    int
product_id int
source     varchar
created    timestamp
expiry     timestamp
active     tinyint

我需要做的是设置 1 张图片处于事件状态 ( active=1 ),其中 product_idsourcetype_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 必须更新为 1LEFT 的行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/

相关文章:

PHP/MYSQL 返回不正确的结果 - MYSQL WHERE 子句

php - 如何使用 PHP 将月份添加到特定日期?

javascript - PHP 注册从返回到错误的 URL 而不是索引,数据库错误?

php - 使用php调用数据库中的图像

asp.net - EF 4.1异常 "The provider did not return a ProviderManifestToken string"

mysql - 在 ORDER BY CASE 中使用 LIKE 的 SQL

java - JasperServer 错误 - 无法获取下一条记录

python - MySQLdb : how to connect with phpMyAdmin

mysql - 如何在 Mysql 语句中添加选择性行

mysql - 如何计算所有列中的数字或出现次数并使用 MySQL 列出它们?