根据订单编号

时间:2011-03-24 23:56:56

标签: mysql sql

我在MySQL中有这样的表:

name     position
apple    0
banana   0
candy    0

我想将其更新为:

name     position
apple    1
banana   2
candy    3

也就是说,我希望更新列position以指示name按字母顺序排序时行的位置。我真的,真的,真的喜欢这样做而不使用变量。此外,真实表中有1000个条目,因此如果程序适度有效,它将有所帮助。

3 个答案:

答案 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子句更快,更有效地做到这一点