Перемещение по таблице

1. Жека 24.01.2010 / 17:05
У меня такая проблема...
Есть обычная таблица link в которой находятся данные.
<?php
CREATE TABLE `link` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  PRIMARY KEY (`id`)
);
?>
В ней 3 строки:
<?php
+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | Новости | 
| 2 | Чат | 
| 3 | Форум | 
+----+-------+ 
?>
Потом всё это я вывожу при помощи цикла, но суть не в этом.
Мне нужно получить в цикле ид текущей, предыдущей и следующей строки.

2. Жека 24.01.2010 / 17:10
Тобишь Чат(last_id['1'],id['2'],next_id['3']);
Как это можно сделать?

3. ramzes 24.01.2010 / 17:31
<?php
$start = ($id>0) ? $id-1 : 0;
$sql = mysql_query("SELECT * FROM link ORDER BY id LIMIT '".$start."', 3;");
while( $res = mysql_fetch_assoc($sql) ){
print_r($res);
}
так? Не очень понял суть вопроса..

4. Жека 24.01.2010 / 18:25
o_O smile
Сам придумал!
<?php
$sql=mysql_query("SELECT * FROM `link` ORDER BY `id`");
while($dan=mysql_fetch_array($sql)) { $r[]=$dan['id'];
echo '<a href="test.php?id='.$dan['id'].'">'.$dan['name'].'</a><br>';
echo '<a href="test.php?tid='.($dan['id']-1).'&bid='.count($r).'">[вверх]</a> ';
echo '<a href="test.php?tid='.($dan['id']+1).'&bid='.count($r).'">[вниз]</a><hr>'; 
}
?>


5. Олег 25.01.2010 / 01:13
MaNGOS cms, не уж-то работает? ))). А теперь представь что если один столбец будет удален?
Мораль в том что столбец id это столбец для сервера/скрипта, но не для человека. Создай еще один столбец sort(int) и по нему сортируй.

6. Олег 25.01.2010 / 01:15
up....

7. ramzes 25.01.2010 / 01:19
#4 по мимо всего еще и цикл там вообще не нуженsmile
#5 зачем еще ячейку? Я же нормальный вариант вроде предложил. Не промахнется хоть что делайsmile

8. Олег 25.01.2010 / 01:37
Затем что судя по вопросу, автор хочет сделать возможность меня передвигать позиции в таблице. Хотя опять же не совсем ясно так ли это.

9. ramzes 25.01.2010 / 01:42
Ну он вроде сказал, есть ид, надо предыдущий и следующий получить вместе с ним..
Или я чего то не так понял ггsmile

10. Олег 25.01.2010 / 01:51
Хоть даже и так, то твой вариант в ситуации где, например, после id 2 сразу идет id 4 даст сбой.
И вообще я так понял твой пример идет в самом цикле, да и ты еще зачем-то цикл написал. Это очень не оптимизированно в частности при больших хитах сувать еще запрос

11. ramzes 25.01.2010 / 01:58
Какой запрос в цикле? Ты где это увидел?smile цикл выводит три строки из результата и всеsmile
сбоя не будет, выберет 2,4,5 начиная от ид2 три записиsmile
ты может мой и его посты спутал?smile

12. Олег 25.01.2010 / 02:13
По порядку. Откуда ты взял значение $id из первой строки? ($start = ($id>0) ? $id-1 : 0;)

13. ramzes 25.01.2010 / 02:18
Ну это же подразумеваетсяsmile он же должен с чего то начинать «ид текущей страницы»
по крайней мере ни каких указаний на то что надо как то иначе, я не нашел в задаче.
Это ты уже придираешьсяsmile

14. Олег 25.01.2010 / 02:27
Вот именно с чего-то начинать)))
Мне нужно получить в цикле ид текущей, предыдущей и следующей строки.
Поэтому я и подразумеваю что ты предложил твой вариант в цикл пихать. Но опять же если внимательно его проработаешь, то поймешь что он не подойдет =).

15. ramzes 25.01.2010 / 02:47
Глядя на код автора понимаю что начинать вообще надо с первой найденной ячейкиsmile
пришел к выводу что мы плохо понимаем друг друга и еще меньше автораsmile даже глядя на его код не понимаю чего он хотел добиться..

16. Жека 25.01.2010 / 07:55
Всем привет! Спасибо за внимание! В 4-ом посте тупанулsad
9. Именно так мне и нужно! Я хочу реализовать сдвиг разделов форума как в моторе. Но там на файлах...sql запрос как сделать я знаю...он меняет местами 2 строки в таблице...но чтобы он работал нужно передать в него текущий ид строки и если сдвигаем вниз...то нужен следующий ид...вверх...предыдущий...воть что я хочюsmile

17. ramzes 25.01.2010 / 15:25
Тогда тебе действительно нужно еще одно поле, ид менят не советую, на него обычно завязаны подкасты (нижние таблицы) и сортировать по этому полю, а ид лучше не трожь..

18. ramzes 25.01.2010 / 15:27
Тогда тебе действительно нужно еще одно поле, ид менят не советую, на него обычно завязаны подкасты (нижние таблицы) и сортировать по этому полю, а ид лучше не трожь..

19. Жека 25.01.2010 / 15:49
чтото я не много не пойму куду и зачем мне ещё одно поле?
17. а я ид и не меняю...я меняю местами значения полей...

20. Олег 25.01.2010 / 18:34
17. а я ид и не меняю...я меняю местами значения полей...
да уж)))) никогда так не делай, тем более если у таблици есть связные зависимые таблицы.

21. Жека 25.01.2010 / 19:01
20. Я пока ещё ни как не делаю...мне надо получить алгоритм...а дальше я уже разберусь что менять...ид или занчение полей...это не трудноsmile

22. ramzes 25.01.2010 / 20:37
Я же тебе сказал, делай еще одно полей как человек тебе предложил и сортируй по нему, его и меняй. А ид трогать ненадо, если конечно ключ.

23. Дмитрий 25.01.2010 / 21:51
поясню немного понятнее, автор, если ты будешь менять ид или название разделы то выйдет что тема была в общение например, а окажется в новостях

24. Жека 25.01.2010 / 21:56
я пошёл на пролом...трудным путёмsmile всётаки добил!
Меня сегодня вечером осинилоsmile
<?php
//основная функция
function change_link($act,$link_id) { 
if($act=="up") { //last ID
$sql=mysql_query("SELECT max(`id`) FROM `link` WHERE `id` < '".$link_id."'");
$initial_id=$link_id; $finite_id=mysql_result($sql,0); } 
else  //next ID
{ $sql=mysql_query("SELECT `id` FROM `link` WHERE `id` > '".$link_id."' LIMIT 1;");
$initial_id=mysql_result($sql,0); $finite_id=$link_id; }
//посылаем запрос
$sql_link=mysql_query("UPDATE `link` AS `a`,
                              `link` AS `b`,
                              `link` AS `c`,
                              `link` AS `d` 
                       SET    `a`.`id`='null',
                              `b`.`id`=`c`.`id`,
                              `c`.`id`=`d`.`id` 
                       WHERE  `a`.`id`='".$initial_id."' 
                       AND    `b`.`id`='".$finite_id."' 
                       AND    `c`.`id`='".$initial_id."' 
                       AND    `d`.`id`='".$finite_id."'");
return ($sql_link) ? TRUE : FALSE; //ответ запроса
} 


25. Жека 25.01.2010 / 21:57
<?php
//результат
if(isset($_GET['msg'])) {
echo ($_GET['msg']!="err") ? 'Раздел успешно сдвинут!<br>' 
                           : 'Ошибка!<br>';
}
//обработка
if($_GET['act']!="" && $_GET['link_id']!=""){ 
if(change_link($_GET['act'],intval($_GET['link_id']))) 
{ Header("Location: test.php?msg=ok"); } 
	else 
{ Header("Location: test.php?msg=err"); }
}
//вывод
$sql=mysql_query("SELECT * FROM `link` ORDER BY `id`");
while($dan=mysql_fetch_array($sql)) { 
echo '<a href="test.php?id='.$dan['id'].'">'.$dan['name'].'</a><br>';
echo '<a href="test.php?act=up&link_id='.$dan['id'].'">[вверх]</a> ';
echo '<a href="test.php?act=down&link_id='.$dan['id'].'">[вниз]</a><hr>';
}
?>
За код сильно не пинайтеsmile

26. Жека 25.01.2010 / 22:01
23. Лан, покажи как сделать сортировку по доп. полю..и как птом его изменять...я чёта не допру...я делал давно ещё что-то подбное с доп. полем но тогда у меня не чё не вышло..хз...я мозг спалил сеsmile

27. Удаленный 25.01.2010 / 22:20
26. MaNGOS cms, mysql_query("SELECT * FROM `table` ORDER BY `number` ASC");

28. Жека 25.01.2010 / 22:30
27. Да это я знаю...кароче...меня не совсем поняли...или я туплю, но всё равно всем спасибоsmile
Тему можно клосед. Всё что мне нужно было я понял. visavi

29. ramzes 26.01.2010 / 01:44
<?php
if(isset($_GET['getup'])){ // подьем
$exist = $sql->query("SELECT id,level FROM link WHERE id = '".abs(intval($_GET['getup']))."';")->fetch_assoc(); // текущая запись
if($exist['id']!=""){
$get = $exist['level']+1; // запись сверху
$sql->query("UPDATE link SET level = level-1 WHERE level = '".$get."';"); // опускаем верхнюю запись
$sql->query("UPDATE link SET level = level+1 WHERE id = '".$exist['id']."';"); // поднимаем текущую запись
}else{ echo'dont exist row'; }
теперь кажись понял что автор хочет.. Код на скорую руку, можно и короче, чисто для примера.
Вывод сортировать: ..ORDER BY level ASC..

30. Удаленный 01.02.2010 / 17:49
гг. Самое элементарное в этом случае - сортировка разделов по времени. Таким образом можно обойтись всего лишь одним запросом -
update table set time=$time where id=$id;
при этом мы имеем неудобство в том плане, что перемещение раздела возможно только в одном направлении. Но зато реализация этого дела ограничивается вышеуказанной строкой

31. ramzes 01.02.2010 / 17:57
Невозможно переместить на нужную позицию, не только вниз но и вверх, только в самый верх поднятьsmile не очень удобно

32. Удаленный 01.02.2010 / 18:00
почему же. Возможно. Просто приходится немножко в пятнашки поиграть. Но поскольку разделы форума нечасто двигаются, то это самый лучший способ в плане реализации

33. Удаленный 01.02.2010 / 18:13
Можно формулу высчитать для поля по которому сортируешь и когда меняешь его, то остальные значения этого поля должны изменяться относительно того, которое ты поменял... Домой приду, попробую написать функцию...

34. Жека 03.02.2010 / 18:55
33. Vetas заинтриговалsmile

URL: https://visavi.net/topics/5303