Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Обменять две записи id и не забыть про детей.
 
 автор: DJ Paltus   (02.08.2009 в 20:59)   письмо автору
 
 

Я пытаюсь поменять положение двух записей в БД местами, но, как мне кажется, делаю это недостаточно правильно. Подскажите, как грамотно к этому вопросу подойти? Структура БД подразумевает наличие парента у каждой записи, кроме записей первого уровня.


<?
if($mode=="movedown"){
    
$id=$_GET['id'];
    
$sql="select parent from pages where id='$id'"
//определяем, есть ли и какой родитель у данной записи
    
$res mysql_query($sql) or die(mysql_error());
    
$row mysql_fetch_assoc($res);
    
$par=$row['parent'];

    
$sql="select id as otherid from pages where id>$id and parent = $par order by id limit 1;"
//у этого ищем запись со следующим бОльшим id
    
$res mysql_query($sql) or die(mysql_error());
    
$row mysql_fetch_assoc($res);
    if(
$otherid=$row['otherid']){
            
//Меняем $id на $otherid при родителе $par
            
$sql="UPDATE pages SET id = 0 WHERE id = $id;";
                
mysql_query($sql);
                
$sql="UPDATE pages SET id = $id WHERE id = $otherid;";
                
mysql_query($sql);
                
$sql="UPDATE pages SET id = $otherid WHERE id = 0;";
                
mysql_query($sql);
            }
?>

5 запросов, имхо, немножко множко. Научите, плиз, делать правильно!

  Ответить  
 
 автор: Valick   (02.08.2009 в 21:47)   письмо автору
 
   для: DJ Paltus   (02.08.2009 в 20:59)
 

Я пытаюсь поменять положение двух записей в БД местами
зачем?

  Ответить  
 
 автор: DJ Paltus   (03.08.2009 в 09:49)   письмо автору
 
   для: Valick   (02.08.2009 в 21:47)
 

Учитывая, что это таблица со страницами сайта, например затем, чтобы они располагались в нужном порядке, при этом сортируясь по id

  Ответить  
 
 автор: Trianon   (03.08.2009 в 11:24)   письмо автору
 
   для: DJ Paltus   (03.08.2009 в 09:49)
 

>Учитывая, что это таблица со страницами сайта, например затем, чтобы они располагались в нужном порядке, при этом сортируясь по id

Вот это как-то странно. Если необходим определенный порядок, почему Вы предпочитаете сортировать по первичному ключу, а не по полю, задающему этот порядок?

PS. Сократите, плиз, текст в скрипте начального поста, так чтоб не нужно было скроллить окно.

  Ответить  
 
 автор: DJ Paltus   (03.08.2009 в 13:30)   письмо автору
 
   для: Trianon   (03.08.2009 в 11:24)
 

>PS. Сократите, плиз, текст в скрипте начального поста, так чтоб не нужно было скроллить окно.
После первого же ответа пост перестает быть редактируемым...

  Ответить  
 
 автор: Trianon   (03.08.2009 в 14:10)   письмо автору
 
   для: DJ Paltus   (03.08.2009 в 13:30)
 

>>PS. Сократите, плиз, текст в скрипте начального поста, так чтоб не нужно было скроллить окно.
>После первого же ответа пост перестает быть редактируемым...
Вот вам ссылка

  Ответить  
 
 автор: Trianon   (02.08.2009 в 22:50)   письмо автору
 
   для: DJ Paltus   (02.08.2009 в 20:59)
 

детьми они махнуться должны чтоли?

  Ответить  
 
 автор: DJ Paltus   (03.08.2009 в 09:50)   письмо автору
 
   для: Trianon   (02.08.2009 в 22:50)
 

Ну а в результате и детьми. Этого запроса я приводить не стал, потому что он у меня уж совсем смешной.

  Ответить  
 
 автор: Trianon   (03.08.2009 в 10:02)   письмо автору
 
   для: DJ Paltus   (03.08.2009 в 09:50)
 


id pid   name
-----------------
 1 0 Кошка
11 1    Котенок1
12 1    Котенок2
 2 0 Собака
21 2    Щенок1
22 2    Щенок2


Поменяйте кошку с собакой. Что должно получиться?

  Ответить  
 
 автор: DJ Paltus   (03.08.2009 в 13:35)   письмо автору
 
   для: Trianon   (03.08.2009 в 10:02)
 

Должно получиться вот это:

id pid   name
-----------------
 1 0 Собака
21 1    Щенок1
22 1    Щенок2

 2 0 Кошка
11 2   Котенок1
12 2  Котенок2

...что логично. А почему Вы спрашиваете?

Я меняю ид родителя у дочерних записей примерно таким же способом, какой тут привел, только обмениваю их не через 0, а через невероятно большое 999999999. Сейчас вникаю в то, что в ответ предложил почтенный Serjinio.

  Ответить  
 
 автор: Trianon   (03.08.2009 в 14:08)   письмо автору
 
   для: DJ Paltus   (03.08.2009 в 13:35)
 

Теперь пересчитайте количество записей, в которых хоть что-то поменялось.
Сделайте вывод.
Serjinio прав абсолютно. Вам нужно применять отдельное поле для сортировки.

  Ответить  
 
 автор: DJ Paltus   (04.08.2009 в 11:50)   письмо автору
 
   для: Trianon   (03.08.2009 в 14:08)
 

Наглядно. Понятно. Убедительно. Благодарю. )

  Ответить  
 
 автор: serjinio   (03.08.2009 в 07:17)   письмо автору
 
   для: DJ Paltus   (02.08.2009 в 20:59)
 

Проще не менять местами значения автоинкрементного поля,а ввести дополнительное поле позиция
типа 0,1,2,.....n
/* Передвинуть вверх */
if(($a === 'up')&& (intval($p) > 0))
{
mysql_query("
UPDATE cat
SET `c_poz` = '".intval($p)."' + ('".intval($p)."'-1) - `c_poz`
WHERE `c_poz` IN ('".intval($p)."', ('".intval($p)."'-1)) AND `s_id` = '".intval($ss)."' ", $db);
echo '<meta http-equiv="refresh" content="0; url=cat.php?">';
}

  Ответить  
 
 автор: DJ Paltus   (03.08.2009 в 10:01)   письмо автору
 
   для: serjinio   (03.08.2009 в 07:17)
 

Логично, однако. И с дитями проблем никаких... на первый взгляд. Однако, с этой позициею куча вопросов возникнет. Например, при смене родителя. Это что, придется сначала а) латать дыру в позициях у того родителя, откуда запись уносим, б) вычислять номер очередной позиции у нового родителя и в) присваивать номер позиции?

btw, а зачем везде приведение к целому стоит?

  Ответить  
 
 автор: serjinio   (03.08.2009 в 10:40)   письмо автору
 
   для: DJ Paltus   (03.08.2009 в 10:01)
 

можно везде убрать оставить только в фильтрации гет
$p =intval($_GET['p']);

Нет..
для родителей и детей своя нумерация позиций...независимая друг от друга..

  Ответить  
 
 автор: DJ Paltus   (03.08.2009 в 12:01)   письмо автору
 
   для: serjinio   (03.08.2009 в 10:40)
 

Я это понимаю.
Но очень много действий надо произвести при смене родителя, согласитесь, чтобы выдать записи валидное место у нового парента. Незанятое и следующее по счету. А еще у предыдущего родителя в счете мест будет дырка, что потом даст ошибку при перемене мест его детей, так что и тут надо переписывать все. Много писанины.

  Ответить  
 
 автор: serjinio   (03.08.2009 в 12:06)   письмо автору
 
   для: DJ Paltus   (03.08.2009 в 12:01)
 

При удалении никаких дыр не будет
/* Пересчитываем новую позицию элементов */
mysql_query(" 
UPDATE `cat` 
SET c_poz = `c_poz` - 1 
WHERE `c_poz` > '$p' AND `s_id`= '".intval ($_GET['s'])."' ",$db); 


а как добавить новую позицию ,чтобы не было пропусков ,вы думаю, сами догадаетесь

  Ответить  
 
 автор: DJ Paltus   (04.08.2009 в 10:10)   письмо автору
 
   для: serjinio   (03.08.2009 в 07:17)
 

Я дико извиняюсь, но что находится в переменной $p и откуда берется?

  Ответить  
 
 автор: serjinio   (04.08.2009 в 16:16)   письмо автору
 
   для: DJ Paltus   (04.08.2009 в 10:10)
 

$p это номер позиции которую надо переместить выше(поменять с верхней местами)

  Ответить  
 
 автор: DJ Paltus   (04.08.2009 в 21:24)   письмо автору
 
   для: serjinio   (04.08.2009 в 16:16)
 

Сегодня пытался применить, мозгов не хватило. Завтра буду дожевывать. Спасибо! ))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования