缩短sql查询

时间:2012-01-11 21:36:56

标签: mysql sql

我做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;

..我知道如何获得它但不知道如何交换它?

1 个答案:

答案 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进行过滤。也许你应该首先测试它的性能,看它是否真的更快。