1

我有这张桌子:

id   ref     data
1    111     data1
2    111     data2
3    111     data3
4    111     data4
5    222     data1
6    222     data2
7    222     data3
8    333     data1
9    333     data2

我想插入一个新字段,例如order,对于每个 ref,我将设置一个新月值。所以输出应该是:

id   ref     data    order
1    111     data1   1
2    111     data2   2
3    111     data3   3
4    111     data4   4
5    222     data1   1
6    222     data2   2
7    222     data3   3
8    333     data1   1
9    333     data2   2

我可以用一个简单的查询来做到这一点吗?

编辑

上面的例子只是一个例子。这是我在数据库上的真实表:

CREATE TABLE `items` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `trackid` varchar(255) NOT NULL,
  `side` varchar(255) NOT NULL,
  `side_pos` char(2) NOT NULL default '#',
  `pos` int(11) NOT NULL,
  `hh` char(2) NOT NULL,
  `mm` char(2) NOT NULL,
  `ss` char(2) NOT NULL,
  `atl` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20229 DEFAULT CHARSET=utf8
4

2 回答 2

6

MySQL 不支持分析(即:ROW_NUMBER),这是您将用于您所追求的输出的内容。采用:

SELECT x.id, x.ref, x.data, x.rank AS `order`
  FROM (SELECT t.id, t.ref, t.data
               CASE 
                 WHEN @ref = t.ref THEN @rownum := @rownum + 1
                 ELSE @rownum := 1
               END AS rank,
               @ref := t.ref
          FROM YOUR_TABLE t
          JOIN (SELECT @rownum := NULL, @ref := -1) r
      ORDER BY t.id, t.ref, t.data) x

通常,这需要单独的语句来声明 @rownum 和 @ref 变量,但如果它们的定义如示例中所见,MySQL 允许您摆脱它。

ref如果值不匹配,CASE 语句会将 @rownum 值重置为 1 。否则,@rownum 加一。与递增的@rownum 值关联的列由ORDER BY子句确定。

于 2011-04-17T17:50:43.430 回答
1

我相信如果你创建一个看起来像 (ref, order) 的主键,其中 order 是一个 auto_increment,你可以让数据库自动为你创建它。

http://mysqldump.azundris.com/archives/5-AUTO_INCREMENT-Trivia.html

于 2011-04-17T18:33:01.257 回答