2016-04-03 5 views
1

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

У меня есть таблица базы данных, которая выглядит более или менее, как это:

ID | URL | Title | Episode | Sequence | Created_at | Modified_at

Они используются для назначения конкретных ссылок на эпизоды подкастов, и они отображаются в порядке, показанном на Sequence. Я создал структуру Laravel, которая взаимодействует со столом, и я могу изменить порядок вещей, манипулируя последовательностью, но у меня возникают проблемы с удалением вещей и поддержанием последовательности в тех целях, в которых я ее хочу. Скажем, у меня есть следующие четыре вещи в таблице:

id = 5, sequence = 1 
id = 6, sequence = 3 
id = 7, sequence = 2 
id = 8, sequence = 4 

При просмотре сайта, страница будет перечислить их в id порядка 5, 7, 6, 8. Тем не менее, если я понимаю, что там была проблема с один из ссылок, я бы удалил его, и в этот момент меня могут оставить id s 5, 7, 8. Последовательность будет 1, 2, 4.

То, что я ищу на данный момент, это способ «повторного заполнения» столбца последовательности на основе каждого эпизода. Это будет то, что в основном принимает все строки с конкретным episode, сортирует их в порядке возрастания на sequence, а затем «renumbers» их в порядке возрастания. Последовательность = 1, 2, 4, 5, 7, 8, 9 изменится на 1, 2, 3, 4, 5, 6, 7.

+0

Почему это проблема, поскольку число постоянно растет? – Mihai

+0

Проблема возникает, когда мне нужно изменить порядок вещей. Если список последовательностей равен 1, 2, 3, 5, 6, и я хочу переместить 5 «вверх» в последовательности, ему нужно сделать много дополнительной работы, чтобы понять, что нет 4 и т. Д. Это было бы гораздо проще, с точки зрения развития, если бы я мог просто поменять значения последовательности одного до или после него, в зависимости от того, перемещаю ли я что-то вверх или вниз. –

+0

Можете ли вы показать немного больше данных и только идентификатор и последовательность ... Возможно, вы, возможно, сделаете запрос, получая правильную последовательность и числовое представление строки без жесткого кода, ссылающегося на последовательность. Вы упоминаете эпизоды, есть ли еще один элемент, такой как «My XYZ Show», Episodes 1-9, и все они добавлены в разные порядки, следовательно, последовательность? – DRapp

ответ

0

Она должна быть относительно простой запрос, такой как

select 
     YT.* 
    from 
     YourTable YT 
    where 
     YT.Episode = 'MO50' 
    order by 
     YT.Sequence 

Теперь, если ваши последовательности создания пробелов для какой-либо причине вы всегда могли бы реализовать переменную MYSQL для увеличения независимо от фактической последовательности .. Попробуйте ..

select 
     @tmpRow := @tmpRow +1 as NewSequence, 
     YT.* 
    from 
     YourTable YT, 
     (select @tmpRow := 0) sqlvars 
    where 
     YT.Episode = 'MO50' 
    order by 
     YT.Sequence 

Таким образом, даже если фактические последовательности для данной показать «MO50» - 2, 3, 8, 12, 15. Фактический столбец «NewSequence» будет отображаться как 1, 2, 3, 4, 5.

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

0

Я не знаю, есть ли встроенная функция, которая делает то, что вам нужно элегантно.

Вот глупый способ сделать это.

Предположим, вы хотите переместить идентификатор = 8 из последовательности 4 до 2.

UPDATE episodes 
SET sequence = sequence+1 
WHERE episode='Episode Name' 
    AND sequence BETWEEN 2 AND 4; 

UPDATE episodes 
SET sequence = 2 
WHERE id = 8; 

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

sequence+1 предназначено для перемещения элемента вверх по списку. Если вы двигаетесь вниз, это будет -1.

Это также означает, что вы должны поддерживать последовательность, если вы удаляете строку. Поэтому, если вы удаляете что-то, вам нужно сдвинуть все под ним. Сделайте это и в транзакции.

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

+0

Правильно, моя проблема возникает именно в том одном предложении, которое вы ветете: «Итак, если вы удаляете что-то, вы должны переложить все под ним на один. Сделайте это в транзакции тоже». В остальном у меня нет проблем - не уверен, правильно ли я объяснил свою проблему. Создание, выбор, изменение, отсутствие проблем. Но если я удалю строку, перенумерация остальных строк - это то, что я не могу понять, что делать. –

+1

Предположим, вы хотите удалить id = 7 (последовательность 2) из ​​своей таблицы. Вы просто удаляете строку. Затем -1 значение последовательности для всех строк 'WHERE sequence> 2'. Сделайте это в транзакции. –

Смежные вопросы