【问题标题】:Pin/Flag a record in a mysql table to true and the rest to false in a single statement在单个语句中将 mysql 表中的记录固定/标记为真,其余记录为假
【发布时间】:2016-12-14 00:02:27
【问题描述】:

包含 50 条记录的地址表。有一个名为“primary_address_indicator”的布尔字段。 我想将选定的记录更新为 true,并自动将所有其他 49 条记录设置为 false。

我知道我可以用 2 条 sql 语句做到这一点 首先(更新所有记录为false)

UPDATE address SET address.primary_address_indicator=0

那么(更新特定记录为真)

UPDATE address SET address.primary_address_indicator=1 WHERE address.record_id=31

有没有办法在一条 sql 语句中做到这一点?像@Rank这样的东西? 保持简单......没有工会或一些奇怪的自我表连接。 也许我正在寻找的东西不存在......这也很好。只是好奇。

【问题讨论】:

  • 你能展示一些示例数据吗?还提到应该如何选择记录进行更新。
  • MySQL update case help的可能重复

标签: mysql sql


【解决方案1】:

更新案例

  UPDATE tableName 
         SET Pin = CASE
                   WHEN 1=1      --'your condition' 
                       THEN True
                   ELSE False
                   END

电脑:@keWalker

【讨论】:

  • 这条sql语句看起来很贵。似乎 2 个简单的更新语句的开销会更少。但是,是的,我想这可以解决问题,谢谢。将阅读更多关于 CASE 的查询
【解决方案2】:

最简单的方法是将布尔结果视为一个数字:

UPDATE address a
    SET a.primary_address_indicator = (a.record_id = 31);

CASE 是正式的方式。这个简写是 MySQL 特有的,但它是我喜欢的数据库特有的特性之一。

【讨论】:

  • 所以你正在做的是一个单独的更新语句,它将所有记录设置为我们想要固定的选定记录。好的。但现在我不能在排序中使用该列,将记录 31 作为显示表中的第一条记录
  • @Lixo 。 . .什么是“显示表”?如果你有一个select 语句,那么你需要一个order by 来指定结果集的顺序。
  • 我按 primary_address_indicator asc 排序,然后按 record_seq_num 排序,然后将结果显示在 html 表中。这样无论其他列如何排序,始终首先显示 pin 记录。谢谢,我现在很好,我看到了几种方法可以完成我需要做的事情。 :)
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多