Переупорядочить родительские / дочерние строки mysql с помощью php - PullRequest
2 голосов
/ 07 декабря 2011

Мне нужно изменить порядок строк представления формы в таблице со следующей структурой для вложенного макета страницы

Столбцы: (имя таблицы: sourcedocs3)

sort1 | sort2 | type

1 | 1 | parent

1 | 2 | child

2 | 1 | no nesting

3 | 1 | parent

3 | 2 | child

3 | 3 | child

4 | 1 | no nesting

Мне нужно иметь возможность переупорядочить (через PHP / Mysql) 3 на 1 без потери базовой структуры - 3 становится 1 и все строки со значением 1 увеличиваются). Звучит просто, но мне трудно сохранить целостность структуры после перетасовки (3 | 1 должно быть 1 | 1, 3 | 2 должно быть 1 | 2 и т. Д.)

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011
START TRANSACTION;

UPDATE `why_do_people_never_give_the_table_name` SET sort1 = 999 
WHERE sort1 = 3;

UPDATE `why_do_people_never_give_the_table_name` SET sort1 = sort1 + 1 
WHERE sort1 BETWEEN 1 AND 3
ORDER BY sort1 DESC;

UPDATE `why_do_people_never_give_the_table_name` SET sort1 = 1 
WHERE sort1 = 999;

COMMIT;

Обратите внимание, что если вы перемещаете меню в более позднюю позицию, например, перемещаете 2 на 4, вы хотите заказать второе обновление в порядке ASCending.

0 голосов
/ 27 декабря 2011

Ответ от Билла был точен - но он не включал код PHP, необходимый для выполнения операции, поэтому вот что я закончил:

    <?php
//if new sort number is less than old sortnum
    if ($newsortnum < $oldsortnum){
         //RUN SEPARATE QUERIES
         $sql_rename="UPDATE  `sourcedocs` SET sort1 = '999' WHERE sort1 =".$oldsortnum." AND category =  '".$category."'";
         $sql_reorder="UPDATE  `sourcedocs` SET sort1 = sort1 +1 WHERE sort1 >= ".$newsortnum." AND sort1 <= ".$oldsortnum." AND category =  '".$category."'";
         $sql_insert="UPDATE  `sourcedocs` SET sort1 =".$newsortnum." WHERE sort1 = '999' AND category =  '".$category."'";
    }
    //if new sort number is greater than old sortnum decrement all sortnums greater than new sortnum and decrement sortnums between 
    if ($newsortnum > $oldsortnum){
    //RUN SEPARATE QUERIES
         $sql_rename="UPDATE  `sourcedocs` SET sort1 = '999' WHERE sort1 =".$oldsortnum." AND category =  '".$category."'";
         $sql_reorder="UPDATE  `sourcedocs` SET sort1 = sort1 -1 WHERE sort1 <= ".$newsortnum." AND sort1 >= ".$oldsortnum." AND category =  '".$category."'";
         $sql_insert="UPDATE  `sourcedocs` SET sort1 =".$newsortnum." WHERE sort1 = '999' AND category =  '".$category."'";
    }
    ?>

Короче говоря, я остановилсясоздание экземпляра PDO для beginTransaction ();... немного более грязно, но это работает.Я могу перейти на метод PDO, но нужно двигаться дальше.Вот ссылка на информацию о PDO, если у вас возникли подобные трудности:

PHP.net - PDO Construct PHP.net - PDO beginTransaction ();

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