|
|
|
| Я пытаюсь поменять положение двух записей в БД местами, но, как мне кажется, делаю это недостаточно правильно. Подскажите, как грамотно к этому вопросу подойти? Структура БД подразумевает наличие парента у каждой записи, кроме записей первого уровня.
<?
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 запросов, имхо, немножко множко. Научите, плиз, делать правильно! | |
|
|
|
|
|
|
|
для: DJ Paltus
(02.08.2009 в 20:59)
| | Я пытаюсь поменять положение двух записей в БД местами
зачем? | |
|
|
|
|
|
|
|
для: Valick
(02.08.2009 в 21:47)
| | Учитывая, что это таблица со страницами сайта, например затем, чтобы они располагались в нужном порядке, при этом сортируясь по id | |
|
|
|
|
|
|
|
для: DJ Paltus
(03.08.2009 в 09:49)
| | >Учитывая, что это таблица со страницами сайта, например затем, чтобы они располагались в нужном порядке, при этом сортируясь по id
Вот это как-то странно. Если необходим определенный порядок, почему Вы предпочитаете сортировать по первичному ключу, а не по полю, задающему этот порядок?
PS. Сократите, плиз, текст в скрипте начального поста, так чтоб не нужно было скроллить окно. | |
|
|
|
|
|
|
|
для: Trianon
(03.08.2009 в 11:24)
| | >PS. Сократите, плиз, текст в скрипте начального поста, так чтоб не нужно было скроллить окно.
После первого же ответа пост перестает быть редактируемым... | |
|
|
|
|
|
|
|
для: DJ Paltus
(03.08.2009 в 13:30)
| | >>PS. Сократите, плиз, текст в скрипте начального поста, так чтоб не нужно было скроллить окно.
>После первого же ответа пост перестает быть редактируемым...
Вот вам ссылка | |
|
|
|
|
|
|
|
для: DJ Paltus
(02.08.2009 в 20:59)
| | детьми они махнуться должны чтоли? | |
|
|
|
|
|
|
|
для: Trianon
(02.08.2009 в 22:50)
| | Ну а в результате и детьми. Этого запроса я приводить не стал, потому что он у меня уж совсем смешной. | |
|
|
|
|
|
|
|
для: 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
|
Поменяйте кошку с собакой. Что должно получиться? | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: DJ Paltus
(03.08.2009 в 13:35)
| | Теперь пересчитайте количество записей, в которых хоть что-то поменялось.
Сделайте вывод.
Serjinio прав абсолютно. Вам нужно применять отдельное поле для сортировки. | |
|
|
|
|
|
|
|
для: Trianon
(03.08.2009 в 14:08)
| | Наглядно. Понятно. Убедительно. Благодарю. ) | |
|
|
|
|
|
|
|
для: 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?">';
}
|
| |
|
|
|
|
|
|
|
для: serjinio
(03.08.2009 в 07:17)
| | Логично, однако. И с дитями проблем никаких... на первый взгляд. Однако, с этой позициею куча вопросов возникнет. Например, при смене родителя. Это что, придется сначала а) латать дыру в позициях у того родителя, откуда запись уносим, б) вычислять номер очередной позиции у нового родителя и в) присваивать номер позиции?
btw, а зачем везде приведение к целому стоит? | |
|
|
|
|
|
|
|
для: DJ Paltus
(03.08.2009 в 10:01)
| | можно везде убрать оставить только в фильтрации гет
Нет..
для родителей и детей своя нумерация позиций...независимая друг от друга.. | |
|
|
|
|
|
|
|
для: serjinio
(03.08.2009 в 10:40)
| | Я это понимаю.
Но очень много действий надо произвести при смене родителя, согласитесь, чтобы выдать записи валидное место у нового парента. Незанятое и следующее по счету. А еще у предыдущего родителя в счете мест будет дырка, что потом даст ошибку при перемене мест его детей, так что и тут надо переписывать все. Много писанины. | |
|
|
|
|
|
|
|
для: 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);
|
а как добавить новую позицию ,чтобы не было пропусков ,вы думаю, сами догадаетесь | |
|
|
|
|
|
|
|
для: serjinio
(03.08.2009 в 07:17)
| | Я дико извиняюсь, но что находится в переменной $p и откуда берется? | |
|
|
|
|
|
|
|
для: DJ Paltus
(04.08.2009 в 10:10)
| | $p это номер позиции которую надо переместить выше(поменять с верхней местами) | |
|
|
|
|
|
|
|
для: serjinio
(04.08.2009 в 16:16)
| | Сегодня пытался применить, мозгов не хватило. Завтра буду дожевывать. Спасибо! )) | |
|
|
|