如何进行带来信息的更新查询(MYSQL)?

时间:2013-12-29 12:10:57

标签: mysql sql

好的,我有一个简单的表,有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中使用会话变量吗?

2 个答案:

答案 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

An SQLfiddle to test with

答案 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);