Нумерация в соответствии с порядком - PullRequest
0 голосов
/ 25 марта 2011

У меня есть такая таблица в MySQL:

name     position
apple    0
banana   0
candy    0

И я хочу обновить его, чтобы оно выглядело так:

name     position
apple    1
banana   2
candy    3

То есть я хочу обновить столбец position, чтобы указать, где находится строка в алфавитном порядке по name. Я действительно, действительно, действительно хотел бы сделать это без использования переменной. Кроме того, в реальной таблице содержится 1000 записей, поэтому было бы полезно, если бы процедура была умеренно эффективной.

Ответы [ 3 ]

2 голосов
/ 25 марта 2011

Без использования переменной:

  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 голосов
/ 25 марта 2011

Это выполнимо в простом SQL.Попробуйте что-то вроде:

UPDATE mytable AS master SET position = (
    SELECT COUNT(*) FROM mytable AS counter WHERE counter.name < master.name
);

Эффективно?Хах.Но даже 1000 записей считается «маленькой» таблицей, поэтому она будет работать быстрее, чем вы думаете.

Надеюсь, это поможет!

PS: Не знаю, что вы 'Вы используете это для, но вполне возможно, что вы могли бы сделать это быстрее и эффективнее с индексом на mytable.name и предложением LIMIT.

2 голосов
/ 25 марта 2011

В MySQL нет решения без использования переменных.

А так как вы спросили "нравится делать это без использования переменной" - тогда окончательный ответ: "Это невозможно в mysql"

Во всяком случае, это решение с переменными, просто чтобы заметить:

select name,
       @I := @I + 1
  from tblname,
       (select @I := 0) x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...