简化SQL查询

4

我对表格进行了三次查询以重新排列行

SELECT @i:=0;
UPDATE imagedata SET imagedata.rank = 0;
UPDATE imagedata SET imagedata.rank = (SELECT @i:=@i+1) WHERE imagedata.kategorieID = 1;

我按照自上而下的顺序执行它。

问题:有没有更短的方法?


感谢所有的反馈,但是我现在有一个不同的想法: 我必须“连接”“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;

一旦“rank”被填充数据,我就可以交换2个ID。因此,我需要: 1)获取id_1和id_2的“rank”列 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;

我知道如何获得它,但不知道如何兑换它?


6
我能退一步问一下,你为什么需要这样做吗? - Joe Stefanelli
第二个查询可能可以省略。 - TimWolla
1
@TimWolla,我也是这么认为的,但后来意识到他基本上想将所有rank设置为0,除了那些具有kategorieID为1的,它们应该被增加。 - Colin O'Dell
1
@Don 请确保在事务中执行整个操作,以避免不一致性。 - TimWolla
1
您用户资料中的网站链接指向一个由域名抢注者运营的网站/链接农场。我猜最好从您的个人资料中删除它,因为a)它不再是您的网站,b)对于几乎任何人来说都没有用处。 - Robert Harvey
显示剩余2条评论
1个回答

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”。也许您应该先测试一下这个性能,看看它是否真的更快。

这样也许可以,但这样你会省略掉具有“NULL” kategorieId的行。 - Lamak
最后一行“UPDATE imagedata SET imagedata.rank = (SELECT @i:=@i+1) WHERE imagedata.kategorieID = 1;”必须按照我的主键排序吗?我该如何避免这种情况? - Don

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接