Задавайте вопросы, мы ответим
Вы не зашли.
Господа, необходимо, как можно проще, поменять две строки в таблице местами (чтобы при выводе в html поменялся порядок их следования).
Неактивен
В html данные выводятся не в том порядке в каком они находятся в таблице, а в том как вы их выбрали.
Для решения вашей задачи возможны 2 варианта:
1. изменить запрос на выборку
2. изменить сами данные в таблице
P.S. На общий вопрос можно получить лишь общий ответ.
Неактивен
Было принято решение "физически" менять местами строчки в базе.
Неактивен
Конкретнее таблица такая:
в строке сначала идёт id записи, в остальных ячейках идут свойства этой записи (имя, описание, .....).
Есть два id-шника, вот записи с такими id-шниками надо поменять в таблице местами.
Неактивен
Насколько я понимаю, "физически" менять местами строчки в базе - записать строку "а" в ту область памяти где раньше была строка "б", а стороку "б" туда где раньше была строка "а".
Даже если вам удасться выполнить это действие, ничего в вашем html скорее всего не измениться
См предыдущий ответ, особенно поскриптум.
Неактивен
jurasmi написал:
Конкретнее таблица такая:
в строке сначала идёт id записи, в остальных ячейках идут свойства этой записи (имя, описание, .....).
Есть два id-шника, вот записи с такими id-шниками надо поменять в таблице местами.
Т.е. вам нужно поменять местами номера id у этих записей.
UPDATE tablename SET id = xxx WHERE id = id1;
UPDATE tablename SET id = id1 WHERE id = id2;
UPDATE tablename SET id = id2 WHERE id = xxx;
xxx - номер не встречающийся в таблице.
Неактивен
Нужно, чтобы в таблице строчка "А" поменялась местами со строчкой "В" (чтобы эти две строчки шли в таблице в другом порядке).
Отредактированно jurasmi (04.12.2009 17:50:55)
Неактивен
А что такое "место" в таблице? Может это как раз и есть номер id?
В принципе, ничто не мешает вам по аналогии с приведенным выше примером обновить не номера id, а другие поля (имя, описание, .....), если вы верите, что в этом случае что-то измениться.
Неактивен
Моя "вера" основана на том, что при запросе к базе данных (для вывода в html) результат выводится строчка за строчкой по порядку (и мне кажется, что в том порядке как строчки расположены в таблице)
$str = "SELECT * FROM mode ";
$modeList = mysql_query($str, __dbconnection__);
while($curMode = mysql_fetch_object($modeList)){
echo $curMode->name;
}
Неактивен
Неактивен
Как видите данные выводятся не в том порядке в каком вносились в таблицу
Т.е. мы пришли к тому с чего начинали, а именно - данные выводятся не в том порядке в каком они находятся в таблице, а в том как вы их выбрали.
В данном случае я конечно схитрил, указав primary key по id, так как знаю, что в случае таких запроса и структуры, оптимизатор mysql станет выбирать данные по индексу.
В вашем случае, для избежания неожиданных результатов, нужно просто явно указать в запросе порядок сортировки:
$str = "SELECT * FROM mode ORDER BY id";
Неактивен
Видимо придётся использовать дополнительное поле, чтобы указывать порядок следования этого элемента.
Неактивен
А чем вас не устраивает уже имеющийся id?
Неактивен
Задача сделать структуру на сайте (разделы, папки) и надо, чтобы можно было менять порядок вывода разделов. Буду делать у раздела ещё одно поле, в котором будет указан порядок его вывода на страницу.
Неактивен
Такая же проблема.
Вывод строк таблицы с сортировкой
$query= "SELECT * FROM forumlist WHERE id ORDER BY gtid ASC ";
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY оставил в покое
Решил сортировать через gtid где gtid число от 1 и выше.
пол дня убил прогоняя разные варианты поменять строки местами.
а хочу реализовать следующее (теория).
что бы при нажатии на кнупку +1 число в поле gtid повышалось на +1 а в строке расположеной выше одновременно число в gtid уменьшалось на -1.
С повышением на +1 я разобрался а вот как реализовать вторую часть задуманого сообразить не могу.
Подскажите пожалуйста с решением вопроса.
Неактивен
Аааа! Некроманты!!!
Прийдется попрограммировать, и написать два запроса — один для увеличения,
второй — для уменьшения. Ну или одну хранимую процедуру, которая будет это
делать.
Неактивен
может есть какие ни будь примеры?
вариант предложеный vasya работает но не верно
Неактивен
? Это про какой вариант речь?
Неактивен
vasya написал:
UPDATE tablename SET id = xxx WHERE id = id1;
UPDATE tablename SET id = id1 WHERE id = id2;
UPDATE tablename SET id = id2 WHERE id = xxx;
xxx - номер не встречающийся в таблице.
вот про этот
код блока перемещения
if(isset($_GET['movetopic'])) { if ($_GET['movetopic'] !="") {
$move1=$_GET['movetopic']; $where=$_GET['where'];
$s = $_GET['movetopic']+1;
$n = $_GET['movetopic']-1;
if ($where=="0") {$where="0";
mysql_query("UPDATE forumlist SET gtid = '".$s."' WHERE gtid = '".$_GET['movetopic']."' LIMIT 1");
mysql_query("UPDATE forumlist SET gtid = '".$n."' WHERE gtid = '".$_GET['movetopic']."' LIMIT 1");
print"++1";
}else{$where="1";
mysql_query("UPDATE forumlist SET gtid = '".$n."' WHERE gtid = '".$_GET['movetopic']."' LIMIT 1");
mysql_query("UPDATE forumlist SET gtid = '".$s."' WHERE gtid = '".$_GET['movetopic']."' LIMIT 1");
print"--1";
}
Header("Location: forum.php");
exit; }}
Отредактированно LOSKAND (03.12.2010 11:09:24)
Неактивен
Пример из серии найдите 10 отличий на рисунке
Отличие первое: у меня 3 апдейта, а у вас 2
...
Что касается работоспособности метода:
Неактивен
Спасибо vasya за подсказку
в общем сделал так
mysql_query("UPDATE forumlist SET gtid = '".$n."' WHERE gtid = '".$a."' LIMIT 1");
mysql_query("UPDATE forumlist SET gtid = '".$s."' WHERE gtid = '".$s."' LIMIT 1");
mysql_query("UPDATE forumlist SET gtid = '".$a."' WHERE gtid = '".$n."' LIMIT 1");
при таком раскладе строки поднимает на одну в верх.
Для опускания строк вниз сделал обратное. тоесть так
mysql_query("UPDATE forumlist SET gtid = '".$s."' WHERE gtid = '".$a."' LIMIT 1");
mysql_query("UPDATE forumlist SET gtid = '".$n."' WHERE gtid = '".$n."' LIMIT 1");
mysql_query("UPDATE forumlist SET gtid = '".$a."' WHERE gtid = '".$s."' LIMIT 1");
работает, но опускает до той позиции с которой начили подём.
если же предже не поднимать строку на позицию выше такая комбинация не работает, тоесть не опускается на строку ниже.
Где я мог допустить ошибку?
Забавно то что по идее комбинация должна работать так как у меня значения $a, $n, $s меняются постоянно.
Отредактированно LOSKAND (27.11.2010 21:57:23)
Неактивен
Сделайте простую тестовую табличку
Неактивен
Используя пользовательские переменные можно менять сортировку в два запроса и один входящий параметр, а именно id изменяемой записи (в данном запросе = 5).
Данный запрос запись с id=5 поднимет вверх (sort_pos-1), а запись с sort_pos > чем у записи id=5 опустит вниз.
Структура таблицы
id,pid,sort_pos
Отредактированно pixmaster (08.07.2011 00:37:50)
Неактивен
таки сделал проверку, а так же в зависимости от направления перемещения (вверх или вниз) автоматом вычисляется @dir, теперь только в условии вручную знак менять в зависимости от направления, если вверх то '<' иначе '>'
Неактивен
На сколько мне известно, +1 вверх или вниз обычно делают следующим способ: Добавляют еще одну колонку для сортировки. Туда при каждом INSERT заносится цифра, которая больше на (10000 например) чем SELECT MAX(sort). По этой колонке и сортируется. При изменении позиции вверх берутся первые 2 значения. которые меньше чем данное, суммируются и делятся на 2. Далее обновляется колонка sort. При сдвиге вниз соответственно первые 2 значения которые больше текущего.
id | name | sort
---------------
1 |name_1| 10000
2 |name_2| 20000
3 |name_3| 30000
4 |name_4| 40000
5 |name_5| 50000
теперь сдвигаем строку 3 на вторую позицию: (20000+10000) / 2 = 15000
в результате:
id | name | sort
---------------
1 |name_1| 10000
2 |name_2| 20000
3 |name_3| 15000
4 |name_4| 40000
5 |name_5| 50000
при выборке ORDER BY sort
У такого подхода есть свои плюсы и минусы. При частом перемещении туда сюда, можно очень быстро прийти к тому, что при делении пополам результат уже не поменяется. Этот способ можно использовать, если в таблице известно примерное кол-во будущих строк и оно не превышает ну например 50.000, так как чем больше шаг при INSERTe, тем чаще можно будет перемещать их.
Неактивен