如何将上排的值放在底行中

时间:2015-06-14 21:59:07

标签: mysql

我有一张这样的表:

+-----+------------+
| id  |    name    |
|-----|------------|
|  1  |     ali    |
|-----|------------|
|  2  |            |
|-----|------------|
|  3  |            |
|-----|------------|
|  4  |    peter   |
|-----|------------|
|  5  |            |
+-----+------------+

我想把上排的值放在底行。 (如果底行为空)。有点像这样:

+-----+------------+
| id  |    name    |
|-----|------------|
|  1  |     ali    |
|-----|------------|
|  2  |     ali    |
|-----|------------|
|  3  |     ali    |
|-----|------------|
|  4  |    peter   |
|-----|------------|
|  5  |    peter   |
+-----+------------+

有可能吗?

3 个答案:

答案 0 :(得分:1)

当然,你可以使用这样的东西:

update t
set name=case 
           when name is null then (select name 
                                   from (select * from t) it 
                                   where it.id<t.id and it.name is not null 
                                   order by id desc
                                   limit 1)
           else name
         end

你可以在行动Mac OS X中看到它,但它的工作方式应该非常明显。唯一有趣的是内部select,这是为了解决MySql的荒谬限制,它不允许您从正在更新的表中进行选择。

答案 1 :(得分:1)

e.g:

UPDATE my_table a
  JOIN 
     ( SELECT x.*
            , MAX(y.name) new_name 
         FROM my_table x 
         JOIN my_table y 
           ON y.id <= x.id 
        GROUP 
           BY x.id
     ) b
    ON b.id = a.id SET a.name = b.new_name;

UPDATE my_table a
  JOIN 
     ( SELECT x.*
            , CASE WHEN name IS NULL THEN @name ELSE @name:=name END new_name 
         FROM my_table x
            , (SELECT @name:=NULL) vars 
        ORDER 
           BY id
     ) b
    ON b.id = a.id
   SET a.name = b.new_name;

答案 2 :(得分:1)

这个怎么样?

var trueFalse: Bool {
    return arc4random_uniform(2) == 1
}

print(trueFalse) // false
print(trueFalse) // true
print(trueFalse) // false


if trueFalse {
    // do that 50% odds
}

这似乎是使用MySQL最简单的方法。