Mysql 高级SQL从同一个表中选择和更新项

Mysql 高级SQL从同一个表中选择和更新项,mysql,Mysql,我有一个表,其中包含行项目id(唯一键)、基本id、步骤id、和活动的行 我需要做的是更新该表中的所有内容,将base\u id其中step\u id=1和active=0匹配到active=1,该表中没有具有相同base\u id和step\u id=2和active=1的条目 ---------------------------------------- | item_id | base_id | step_id | active | | 1 | 1 | 1

我有一个表,其中包含行
项目id
(唯一键)、
基本id
步骤id
、和
活动的行

我需要做的是更新该表中的所有内容,将
base\u id
其中
step\u id
=1和
active
=0匹配到
active
=1,该表中没有具有相同
base\u id
step\u id
=2和
active
=1的条目

----------------------------------------
| item_id | base_id | step_id | active |  
| 1       | 1       | 1       | 0      |
| 2       | 1       | 2       | 1      |
| 3       | 2       | 1       | 0      |
| 4       | 3       | 1       | 0      |
| 5       | 3       | 1       | 0      |
----------------------------------------
这将返回使项目3、4和5更新为活动的
=1

如果这有道理的话。非常感谢您的帮助。提前谢谢

select item_id 
from your_table
where base_id in
(
  select base_id
  from your_table
  group by base_id
  having sum(step_id = 1 and active = 0) > 0
     and sum(step_id = 2 and active = 1) = 0
)
内部选择功能是什么?
它按
base\u id
对记录进行分组,只取那些至少有一个
step\u id=1且处于活动状态的记录,以及零个
step\u id=2且处于活动状态的记录

sum()
计算内部条件为真的次数

内部选择功能是什么?
它按
base\u id
对记录进行分组,只取那些至少有一个
step\u id=1且处于活动状态的记录,以及零个
step\u id=2且处于活动状态的记录


sum()

select t.*
from table t
where step_id = 1 and active = 0 and
      not exists (select 1
                  from table t2
                  where t2.base_id = t.base_id and t2.step_id = 2 and t2.active = 1
                 );

这似乎是对您描述的直接翻译。

我将在
存在中使用一个简单的

select t.*
from table t
where step_id = 1 and active = 0 and
      not exists (select 1
                  from table t2
                  where t2.base_id = t.base_id and t2.step_id = 2 and t2.active = 1
                 );

这看起来像是对您描述的直接翻译。

要更新表,以便将匹配值的
活动设置为
1
,我们可以将其转换为update语句

由于MySQL在更新子查询中引用的表时遇到一些问题,因此我们插入了额外的嵌套级别,强制创建临时结果并允许更新:

update table1 t
set t.active = 1
where base_id in (
  select base_id from (
    select base_id
    from table1
    group by base_id
    having sum(step_id = 1 and active = 0) > 0
       and sum(step_id = 2 and active = 1) = 0
  ) a 
);
这将为
项目id
3、4和5设置
active=1


要更新表格,以便将匹配值设置为
1
,我们可以将其转换为update语句

由于MySQL在更新子查询中引用的表时遇到一些问题,因此我们插入了额外的嵌套级别,强制创建临时结果并允许更新:

update table1 t
set t.active = 1
where base_id in (
  select base_id from (
    select base_id
    from table1
    group by base_id
    having sum(step_id = 1 and active = 0) > 0
       and sum(step_id = 2 and active = 1) = 0
  ) a 
);
这将为
项目id
3、4和5设置
active=1


我编辑了第一篇文章,让你知道预期的结果是什么。这不就是你想要的结果吗?我以前从未使用过sum,你能详细说明这将如何实现吗?我编辑了第一篇文章,让你知道预期的结果会是什么。这不会给你带来预期的结果吗?我以前从未使用过sum,你能详细说明这将如何实现吗?