Добавить поле и вставить значение приращения - PullRequest
1 голос
/ 17 апреля 2011

У меня есть эта таблица:

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 , где для каждой ссылки я установлю значение полумесяца. Таким образом, вывод должен быть:

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

я могу сделать это простым запросом?

EDIT

Приведенный выше пример является лишь примером. Это моя настоящая таблица в базе данных:

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

Ответы [ 2 ]

6 голосов
/ 17 апреля 2011

MySQL не поддерживает аналитику (IE: 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 позволяет вам обойтись без них, если они определены так, как вы видите в примере.

Оператор CASE сбрасывает значение @rownum в единицу, если значения ref не совпадают. В противном случае @rownum увеличивается на единицу. Столбец, с которым связано увеличивающееся значение @rownum, определяется предложением ORDER BY.

1 голос
/ 17 апреля 2011

Полагаю, если вы создадите первичный ключ, который выглядит как (ref, order), где order - это auto_increment, вы можете сделать так, чтобы база данных создала его для вас автоматически.

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

...