Обновите поле для увеличения, пока другое поле не изменится - PullRequest
0 голосов
/ 04 октября 2018

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


Сводка

У меня есть система, которая хранит documents с соответствующими им paragraphs;каждый document содержит много paragraphs.Эти данные хранятся в базе данных MySQL.

Таблица paragraphs имеет следующие поля:

  • Первичный ключ (AUTO INCREMENT)
  • Идентификатор документа (внешнийключ к таблице документа)

Я хочу добавить новое поле в таблицу paragraphs, в которой будет указан индекс данного абзаца по отношению к документу, в котором он находится. Этот запрос будет выполняться толькоодин раз при переносе добавляем это поле;затем я планирую заполнить его при вставке абзацев.

Первый абзац в каждом документе должен иметь индекс = 0. Второй абзац в каждом документе должен иметь индекс = 1.

Таблица абзацев

Первичный ключ: 1 Идентификатор документа: 1 Индекс: 0

Первичный ключ: 2 Идентификатор документа: 1 Индекс: 1

Первичный ключ: 3 Идентификатор документа:1 Индекс: 2

Первичный ключ: 4 Идентификатор документа: 2 Индекс: 0

Первичный ключ: 5 Идентификатор документа: 2 Индекс: 1

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

Большое спасибо за вашу помощь!Дом

1 Ответ

0 голосов
/ 04 октября 2018

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

alter table paragraphs add index int;

set @d := 0;
set @i := 0;

update paragraphs
    set index = (if(@d = document_id, @i := @i + 1,
                    if(@d := document_id, @i := 1, @i := 1)
                   )
                ) - 1  -- to start numbering at 0 rather than 1
    order by document_id, primary_key;

Примечание: index - действительно плохое имя для столбца, потому что это ключевое слово SQL.Назовите столбец как-нибудь еще, например paragraph_number.

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