MySQL: Как получить последовательный номер со строками?

Как я могу подсчитать результаты, когда самый низкий ID – №1, а самый высокий ID – #numberOfResults

Пример. Если у меня есть таблица с тремя строками. чьи идентификаторы равны 24, 87, 112, он будет тянуть так:

ID 24 87 112 Num 1 2 3 

Причина, по которой я хочу это, – мой менеджер хочет, чтобы элементы были пронумерованы как item1, item2 и т. Д. Я изначально сделал это так, чтобы он использовал ID, но он видел их как item24, item87, item112. Ему совсем не понравилось, и они хотят, чтобы они были как item1, item2, item3. Я лично думаю, что это приведет к проблемам, потому что если вы удаляете и добавляете элементы, то item2 не всегда будет ссылаться на одно и то же и может вызвать путаницу для пользователей. Поэтому, если у кого-то есть лучшая идея, я бы хотел это услышать.

Благодарю.

Я согласен с комментариями о том, что вы не используете такую ​​схему нумерации, если числа будут использоваться для чего-либо иного, кроме простого упорядоченного отображения элементов с числами. Если цифры действительно будут привязаны к чему-то, то это действительно плохая идея!

Используйте переменную и увеличивайте ее в SELECT :

 SELECT id, (@row:=@row+1) AS row FROM table, (SELECT @row:=0) AS row_count; 

Пример:

 CREATE TABLE `table1` ( `id` int(11) NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE=InnoDB INSERT INTO table1 VALUES (24), (87), (112); SELECT id, (@row:=@row+1) AS row FROM table1, (SELECT @row:=0) AS row_count; +-----+------+ | id | row | +-----+------+ | 24 | 1 | | 87 | 2 | | 112 | 3 | +-----+------+ 

Как это работает

@row – это определяемая пользователем переменная. Нужно установить его в ноль перед SELECT основной SELECT . Это можно сделать следующим образом:

 SELECT @row:=0; 

или вот так:

 SET @row:=0 

Но удобно связывать два утверждения вместе. Это можно сделать, создав производную таблицу, что и происходит здесь:

 FROM table, (SELECT @row:=0) AS row_count; 

Второй SELECT фактически запускается первым. Как только это будет сделано, это всего лишь случай увеличения значения @row для каждой полученной строки:

 @row:=@row+1 

Значение @row увеличивается каждый раз, когда извлекается строка. Он всегда будет генерировать последовательный список чисел, независимо от того, какой порядок доступа к ним. Так что это удобно для некоторых вещей, и опасно для других вещей …

Похоже, было бы лучше просто сделать это число в вашем коде вместо того, чтобы пытаться придумать какой-то запутанный способ сделать это с помощью SQL. Когда вы перебираете элементы, просто поддерживайте их.

Для чего используется идентификатор?

Если это только для быстрой и простой справки, это нормально, но если это необходимо для удаления или управления каким-либо образом, как вы упомянули, то единственным вариантом будет присвоение нового столбца идентификатора, который является уникальным для каждой строки в таблице. Делать это бессмысленно, потому что это дублирует цель вашего начального столбца ИД.

У моей компании была аналогичная задача в системе CMS, которая использовала поле заказа для сортировки статей на первой странице сайта. Пользователи хотели, чтобы значок «продвигать, понижать», который они могли щелкнуть, переместил бы статью вверх или вниз.

Опять же, не идеально, но стратегия, которую мы использовали, заключалась в том, чтобы создать функцию продвижения и сопровождающую функцию понижения, которая идентифицировала текущее значение сортировки через запрос, добавила или вычитала одну из предыдущего или следующего значения соответственно, затем установила значение первоначально продвинутого / пониженный уровень. Также важно было создать вкладку записи, чтобы точно установить начальное значение вновь добавленных записей, чтобы вставки не приводили к дублированию значения. Это было также соблюдено на уровне БД для безопасности. Пользователю никогда не разрешалось напрямую вводить значение сортировки, только рекламировать или понижать с помощью значков. Честно говоря, это очень хорошо работало для пользователя.

Если вам нужно пройти этот маршрут ….. это не невозможно. Но есть повреждение мозга ….