我做3个查询来重新排序表格的行
SELECT @i:=0;
UPDATE imagedata SET imagedata.rank = 0;
UPDATE imagedata SET imagedata.rank = (SELECT @i:=@i+1) WHERE imagedata.kategorieID = 1;
我从上到下执行。
问题:这是一个较短的方法吗?
thx所有反馈.. 但我现在有一个不同的Idear: 不知何故,我必须“连接”“kategorieID”与“id(主键)”列 因此,我需要将这两种信息存储在“rank”列中,格式如下:
CXXX
c =类别编号(0到4) xxx = id(1到... n)..唯一!
例如:输出:
rank
+------+
+ 1001 +
+ 1002 +
+ 1003 +
+ ... +
+ 1018 +
+ ... +
+ 2001 +
+ 2002 +
+ 1019 +
+ 1020 +
到目前为止,我做到了:
UPDATE imagedata SET imagedata.rank = (SELECT CONCAT(kategorieID,"",LPAD(id,3,'0')) ) WHERE id=88;
一旦“排名”填满数据,它就会让我更换掉2个ID。
因此我必须: 1)得到id_1和id_2的“等级”列 2)获取该字符串的子字符串('xxx')例如:(“004”..“012”) 3)交换id_1“rank”和id_2“rank”
的子串SELECT @ix1:=SUBSTRING(rank, -3) FROM imagedata WHERE id=88;
SELECT @ix2:=SUBSTRING(rank, -3) FROM imagedata WHERE id=83;
..我知道如何获得它但不知道如何交换它?
答案 0 :(得分:1)
我会修改第二个查询,只更新第三个不会更新的行,如下所示:
SELECT @i:=0;
UPDATE imagedata SET imagedata.rank = 0 WHERE imagedata.kategorieID <> 1;
UPDATE imagedata SET imagedata.rank = (SELECT @i:=@i+1) WHERE imagedata.kategorieID = 1;
编辑:每个Lamak的评论,如果kategorieID
可能是NULL
,您可能会想要这样做:
SELECT @i:=0;
UPDATE imagedata SET imagedata.rank = 0 WHERE imagedata.kategorieID <> 1 OR imagedata.kategorieID IS NULL;
UPDATE imagedata SET imagedata.rank = (SELECT @i:=@i+1) WHERE imagedata.kategorieID = 1;
此外,此解决方案可能比您的解决方案慢,特别是如果kategorieID
上没有索引。我这样说是因为即使您要更新较少的行,它现在必须先对WHERE
进行过滤。也许你应该首先测试它的性能,看它是否真的更快。