mysql - 从同一个表中选择计数的 UPDATE 语句以查找第一次出现
问题描述
我有一张会员资格表,如果同一用户之前没有其他会员资格,我想将给定的会员资格标记为“第一次”。
我正在尝试在 MySQL 中进行打击,但我得到:“一般错误:1093 您不能在 FROM 子句中指定目标表 'orgUserPlan' 进行更新”
UPDATE orgUserPlan SET isFirstTime =
!(SELECT COUNT(id)FROM orgUserPlan
WHERE orgUserPlan.orgUser_id = 1
AND orgUserPlan.id < 123456
AND orgUserPlan.isDeleted != true
AND orgUserPlan.isCanceled != true)
WHERE orgUserPlan.id = 123456
解决方案
是的,MySQL 不允许您在同一个表的子查询中执行 SELECT,而您已经在外部查询中执行了 UPDATE 或 DELETE。
MySQL 确实支持多表 UPDATE 语法。您的案例可以在不使用 COUNT(*) 的情况下完成。请改用联接。
UPDATE orgUserPlan AS o1
LEFT OUTER JOIN orgUserPlan AS o2
ON o1.orgUser_id = o2.orgUser_id AND o1.id > o2.id
AND o2.isDeleted != true AND o2.isCanceled != true
SET o1.isFirstTime = o2.id IS NULL;
如果没有其他行具有相同的用户 id 和较早的id
,则外连接将返回所有o2.*
NULL 列。这意味着o1
指向该用户 ID 的最早行。
推荐阅读
- java - 如果您决定重命名类中的字段,如何读取旧的 json 字符串(使用 gson)
- c# - 执行新作业时出现 Azure.WebJobs.Host.FunctionInvocationException
- php - 将嵌套数组打印为列表
- php - 过滤模型属性上的 ListEntry 没有 DB 中的列
- intellij-idea - aiTcpListener - 端点上的 TCP 通道绑定失败 [/0.0.0.0:9000] java.net.BindException:地址已在使用:绑定
- javascript - 模态不带有输入值
- java - Java awt - 获取根窗口的标题
- android - @VisibleForTesting 在 Kotlin 中?
- c# - WCF:在代码中将 CustomBinding 设置为仅传输安全性
- javascript - 如何在 Xterm.js 中实现“BackSpace”、“arrow”?