好的,我有一个简单的表,有5列。
ID - No - Text - Type - DependentID 21 - 1 - Text1 - 8 24 - 2 - Text2 - 2 32 - 3 - Text3 - 3 34 - 4 - Text4 - 6 44 - 5 - Text5 - 7 33 - 6 - Text3 - 1 38 - 7 - Text4 - 8 45 - 8 - Text5 - 7
要求:系统将从上到下阅读(基于ASC订单号),如果它看到类型为> 3的行,那么它将查找之前的最近行如果找到一个类型= 1或2或3,那么它会将前一个壁橱类型的ID(1/2/3)带入DependentID,如果它没有找到任何先前最接近的类型1/2/3,那么它将零置于dependentID中。
注意:它不会更新type = 1,2,3。
的行因此更新后的结果将如下:
ID - No - Text - Type - DependentID 21 - 1 - Text1 - 8 - 0 24 - 2 - Text2 - 2 32 - 3 - Text3 - 3 34 - 4 - Text4 - 6 - 32 44 - 5 - Text5 - 7 - 32 33 - 6 - Text3 - 1 38 - 7 - Text4 - 8 - 33 45 - 8 - Text5 - 7 - 33
那么在这种情况下如何进行更新查询以使ID结束?
我们可以在mysql中使用会话变量吗?
答案 0 :(得分:1)
你可以使用UPDATE
和几个LEFT JOIN
s。 m2
左连接是查找以前匹配的所有行,而m3
左连接是为了消除除最佳匹配之外的所有匹配;
UPDATE mytable m
LEFT JOIN mytable m2 ON m.No > m2.No AND m2.Type <= 3
LEFT JOIN mytable m3 ON m.No > m3.No AND m3.No > m2.No AND m3.Type <= 3
SET m.DependentId = COALESCE(m2.id, 0)
WHERE m3.No IS NULL AND m.Type > 3
答案 1 :(得分:1)
您可以使用相关子查询获取以前的依赖ID:
select t.*,
(select id
from table t2
where t2.type in (1, 2, 3) and
t2.no < t.no
order by t2.no desc
limit 1
) as NewdependentID
from table t
where t.type > 3;
(实际上,这给了NULL
没有匹配,但没关系。)
您可以将此查询添加到update
并加入:
update table t join
(select t.*,
(select id
from table t2
where t2.type in (1, 2, 3) and
t2.no < t.no
order by t2.no desc
limit 1
) as NewDependentID
from table t
where t.type > 3
) tdep
on t.no = tdep.no
set t.DependentID = coalesce(tdep.NewDependentID, 0);