MySQL: как заказать и установить идентификаторы? - PullRequest
0 голосов
/ 02 сентября 2018

Я уже погуглил, но не смог найти решение.

У меня есть два столбца с именами order_id и name. Я хочу ORDER BY name, а затем SET по возрастанию order_id.

Как это:

order_id   name
1          Arya
2          Herbert
3          Paul
4          Peter
5          Tiffany

Мой столбец идентификатора int(4) и по умолчанию 0. Это не PRIMARY или UNIQUE. (Это также не основной идентификатор. Основной идентификатор, конечно, PRIMARY.

Как я могу сделать это с SQL?

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Для версий <8.0 вы можете использовать это: </p>

select @rn := 0;

UPDATE tbl T1
JOIN (select @rn := @rn + 1 rn, `name` from tbl order by `name`) T2
  ON T1.`name` = T2.`name`
SET T1.order_id = T2.rn

Демо

Полезная статья, связанная с вашей проблемой: ОБНОВЛЕНИЕ MySQL JOIN

0 голосов
/ 02 сентября 2018

Поскольку ваша версия mysql ниже 8.0, вы должны вручную сгенерировать orderid. ниже может помочь вам

select  t.*, 
                   @rownum := @rownum + 1 AS order_id from 
            (
            select * from
             tab o order by name asc
            )  as t , (SELECT @rownum := 0) r

http://www.sqlfiddle.com/#!9/ae3fda/3

0 голосов
/ 02 сентября 2018

Вы можете использовать ROW_NUMBER (MySQL 8.0 +):

SELECT name, ROW_NUMBER() OVER(ORDER BY name) AS rn
FROM tab
ORDER BY rn;

Обновление:

UPDATE tab
SET order_id = (SELECT rn FROM (SELECT name,ROW_NUMBER() OVER(ORDER BY name) AS rn
                                FROM tab)s
                WHERE s.name = tab.name); -- assuming that name is UNIQUE

Демоверсия DBFidde

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...