2012-07-21 129 views
1

我有一张图像表,它与特定组(vehID)相关联,我需要为每个组创建它们的顺序。MySQL使用组的rowid更新列值

这是一个领域我忘了在设计初始图像输入位置。

我一直在玩@row,但没有得到很远。

set @row= 0; 
select @row:[email protected]+1 as row, vehID,imgID from images group by vehID; 

这使我的ROWID,但不会重置为每个组

每个vehID有1到n项,我希望来计算值和更新的行与计算值项。

我无法弄清楚如何在更改车辆时将@row重置为0。可能有些子选择。

如果我能选择的工作就如何代码的任何建议的更新,如果不是很明显,将不胜感激

Update images set imgPosition = Calculated Value where imgID = current imgID 

回答

4

你只需要申报持有原先vehID另一个变量。然后使用IF语句,您可以将vehid与前一个进行比较,并相应地设置行号。然后将前一个车辆变量设置为当前行的车辆编号。

请注意,我将“group by”更改为“order by”。这有两个原因:

1列出所有行

2至确保来自同一ID行彼此跟随。否则与以前的值比较将不正确。

最后,请确保您比较之前的vehID值,并在重置之前的变量以保留当前行的值之前确定rownum的内容。

set @previous_vehID= 0; 
set @row= 0; 
select if(@previous_vehID=vehID, @row:[email protected]+1, @row:=1) as row,@previous_vehID:=vehID, vehID,imgID from images order by vehID 

编辑:

我只是错过了更新的一部分。你可以尝试交叉表更新为:

set @previous_vehID= 0; 
set @row= 0; 
update images a, (
    select if(@previous_vehID=vehID, @row:[email protected]+1, @row:=1) as row,@previous_vehID:=vehID, vehID,imgID from images order by vehID) aa 
set a.imgPosition = aa.row where a.vehID=aa.vehID and a.imgID=aa.imgID 

上述使得选择并在单个语句/查询更新。如果不起作用,请将结果插入临时表并使用它们在单独的语句中进行更新。

+0

杰出 - 我不会那么做过。直到昨天,我不知道你可以使用变量和IF语句。现在我所有的图像都被排序。我希望这对更多的人有用。非常感谢你。 – mcl 2012-07-22 09:34:11