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

时间:2015-08-28 20:34:38

标签: mysql

我的表格包含行item_id(唯一键),base_idstep_idactive

我需要做的是更新该表中的所有内容,其中base_id匹配step_id = 1而active = 0到active = 1在同一个表格中有相同的base_idstep_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项更新为active = 1

如果这是有道理的。任何帮助是极大的赞赏。提前谢谢。

3 个答案:

答案 0 :(得分:3)

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_id对记录进行分组,仅记录step_id = 1 and active个记录至少为1的记录,step_id = 2 and active = 1记录为零记录。

sum()计算内在条件成立的次数。

答案 1 :(得分:1)

我会通过一个简单的inexists

来解决这个问题
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
                 );

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

答案 2 :(得分:1)

要更新表格以便将匹配值active设置为1,我们可以将solution by juergen d转换为更新语句。

由于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 
);

这会为active = 1 item_id

设置3, 4 and 5

Sample SQL Fiddle