将数据从一行移动到另一行

时间:2012-05-21 21:09:56

标签: mysql

我不太确定我是否以错误的方式思考这个问题,所以如果是这样的话,也许有人会指出我正确的方向。但是,如果我只是错过了这个概念,那么也许我可以得到帮助。

所以任何方式我都会赢......或者其他什么。

我想要做的是这样的事情,给定数据库中的表,在单个查询中将特定值移动到另一行。

澄清以此表为例:

id I value
0 I 5
1 I 2

我想移动 id = 0 ,以便表格成为:

id I value
0 I 0
1 I 5

(OBSERVE! id = 1 的值无关紧要,它被覆盖, id = 0 _value_只是设置为零)

到目前为止,我的尝试一直是一个问题:

UPDATE atable 
SET item = CASE id 
WHEN '1' THEN (SELECT value FROM atable WHERE id='1') 
WHEN '0' THEN '0' 
END;

但是这无效,我不能以这种方式使用 SELECT 。所以我的#2是:

UPDATE atable 
SET item=(SELECT value FROM atable WHERE id='1') 
WHERE id='0';

哪种方式有效,但我找不到为 id = 0

设置 value = 0 的方法

我希望这一切都有道理,现在不仅仅是漫无目的。

试着说清楚: 我想值从一行移动到另一行,所以复制不会这样做我可以想出那一行。我想在一个查询中执行此操作,当然我可以将其拆分为两个查询,这很简单

感谢您抽出宝贵的时间阅读本文。

4 个答案:

答案 0 :(得分:2)

我认为这会有所帮助 -

UPDATE atable a,
(SELECT value, id FROM atable) c
SET a.value = c.value 
WHERE a.id < @MAX(id)
AND a.id = c.id + 1;

唯一的条件是id应该是顺序的,你不应该激活安全更新模式。

答案 1 :(得分:1)

这种类型的事情通常在事务中执行,以使其表现为原子操作。例如:

start transaction;    
set @myval = (select value from atable where id = 0);
update atable set value = @myval where id = 1;
update atable set value = 0 where id = 0;
commit;

可以使用单个语句将值从第一行“移动”到另一行,但是它看起来非常丑陋且可能效率较低。我认为以下可能会这样做,但我认为这不是一个好主意。

update atable set value = 
      (select x.value from 
            (select value from atable where id = 0) x) 
   where id = 1;

答案 2 :(得分:1)

您可以使用一个查询执行此操作,但只有在ID预期为顺序时才可能

update a set a.value=isnull(b.value,0) from atable a left outer join atable b on a.id=b.id+1

修改

update a set a.value=ifnull(b.value,0) from atable a left outer join atable b on a.id=b.id+1

答案 3 :(得分:0)

我相信我会选择&#34; easy&#34;解决方案,因为我确实有更多关于问题的信息我不会说需要来动态地读取它。

因此,对于我的特殊问题,我决定像这样解决它:

我有这些参数(在php中):

$fromSlot, $toSlot, $itemID

我想将$itemID从一个广告位移到另一个广告位。

但由于我知道该项目的ID,我可以将其插入$toSlot并将$fromSlot项设置为零。

该表格基本上有slotID, itemID,其中slotID是唯一键,而itemID是引用该广告位中项目的ID。

我的查询变为:

UPDATE `slots` SET item = CASE slotID
WHEN '$fromSlot' THEN '0'
WHEN '$toSlot' THEN '$itemID'
END;

这样我就不必担心它可能先将$fromSlot设置为零然后再复制&#34;将零归入$toSlot

我想避免将$itemID全部发送到一起但是意识到它确实不是一个大问题,因为我宁愿避免发出两个查询然后发送额外的参数。

我想的替代方案是跳过发送$itemID,然后先使用$toSlot更新UPDATE slots SET item = (SELECT item FROM slots WHERE slotID='$fromSlot'),然后再设置$fromSlot.item

的第二个查询

这就是我将如何解决它。

任何切肉刀的想法或其他当然是受欢迎的,但我会将此标记为我接受的答案。

如果没有其他任何可能帮助人们按照我的思路思路并理解我为什么问(并回答-_-)这个问题。