На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> Перестроение пользовательской сортировки , Любой диалект SQL
    Интересует способ перестроения пользовательской сортировки

    Исходные данные (упрощенно):

    1) Таблица "Рубрикаторы"

      Id - SERIAL
    Name - VARCHAR
    

    2) Таблица "Сортировки"

      RubId - INTEGER
    SortKey - INTEGER
    

    Вторая таблица нужна для того, чтобы предполагаемый пользователь мог сохранять нужный ему порядок сортировки "рубрикаторов".
    Изначально Id=RubId=SortKey

    Вопрос: каким запросом(ами) произвести модификацию таблицы "Сортировки", по образцу:

    RubId | KeySort
    ---------------
      1   |   1
      2   |   2
      3   |   3 <─┐
      4   |   4   │
      5   |   5   │
      6   |   6   │
      7   |   7 ──┘
      8   |   8  
      9   |   9
    ---------------
    

    Нужно перенести 7-ю позицию на 3-е место:

    RubId | KeySort
    ---------------
      1   |   1
      2   |   2
      3   |   4
      4   |   5
      5   |   6
      6   |   7
      7   |   3
      8   |   8
      9   |   9
    ---------------
    
      Для MySQL:
      ExpandedWrap disabled
        UPDATE test
        SET SortKey = SortKey + CASE SortKey
                                WHEN @from THEN @to-@from
                                ELSE            sign(@from-@to)
                                END
        WHERE SortKey BETWEEN LEAST(@from,@to) AND GREATEST(@from,@to);
        Цитата Akina @
        Для MySQL:

        Пасиб, поразбираюсь!
        А это любой перенос сработает, я имею ввиду вниз, вврерх, в первую, в последнюю позиции?
          Поразбирайся. Все вопросы сами отпадут.
            Гуд, благодарю! :)
              Запрос для понимания сути происходящего:
              ExpandedWrap disabled
                SET @from=3;
                SET @to=5;
                SELECT *, SortKey + CASE SortKey
                                    WHEN @from THEN @to-@from
                                    ELSE            sign(@from-@to)
                                    END
                FROM test
                -- WHERE SortKey BETWEEN LEAST(@from,@to) AND GREATEST(@from,@to)
                -- ORDER BY id
                ;

              Повторять, произвольно меняя значения переменных.

              PS. Предполагается, что у SortKey нумерация непрерывная, а @from и @to входят в список имеющихся в таблице значений.
              Сообщение отредактировано: Akina -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0225 ]   [ 15 queries used ]   [ Generated: 25.04.24, 02:16 GMT ]