我的表格包含行item_id
(唯一键),base_id
,step_id
和active
。
我需要做的是更新该表中的所有内容,其中base_id
匹配step_id
= 1而active
= 0到active
= 1在同一个表格中有相同的base_id
和step_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
如果这是有道理的。任何帮助是极大的赞赏。提前谢谢。
答案 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)
我会通过一个简单的in
或exists
:
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