我在MySQL中有这样的表:
name position
apple 0
banana 0
candy 0
我想将其更新为:
name position
apple 1
banana 2
candy 3
也就是说,我希望更新列position
以指示name
按字母顺序排序时行的位置。我真的,真的,真的喜欢这样做而不使用变量。此外,真实表中有1000个条目,因此如果程序适度有效,它将有所帮助。
答案 0 :(得分:2)
没有使用变量,mysql中没有解决方案。
既然你问“喜欢不使用变量就这样做” - 那么最后的答案是“在mysql中不可能”
无论如何,这是一个带变量的解决方案,只需注意:
select name,
@I := @I + 1
from tblname,
(select @I := 0) x;
答案 1 :(得分:2)
不使用变量:
SELECT a.name,
(SELECT COUNT(*)
FROM YOUR_TABLE b
WHERE b.name <= a.name) AS position
FROM YOUR_TABLE a
ORDER BY position
问题是,重复将获得相同的位置编号。
变量是唯一没有重复位置值的选项:
SELECT a.name,
@rownum := @rownum + 1 AS position
FROM YOUR_TABLE a
JOIN (SELECT @rownum := 0) r
...无需创建一个名为position
的列设置为AUTO_INCREMENT的表。
MySQL不支持分析函数,例如ROW_NUMBER,这是您在这种情况下使用的。
答案 2 :(得分:2)
在纯SQL中可行。尝试类似:
UPDATE mytable AS master SET position = (
SELECT COUNT(*) FROM mytable AS counter WHERE counter.name < master.name
);
高效?哈。但即使是1000个条目也被认为是一个“小”表,所以它会比你想象的要快。
希望这有帮助!
PS:不知道你使用的是什么,但很有可能你可以使用mytable.name
上的索引和LIMIT
子句更快,更有效地做到这一点