Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Порядок записей


Автор: Spectre 22.7.2006, 11:17
Есть таблица id, title, body, num
num - это порядковый номер в котором выводить на экран запись.
Мне надо сделать так, что бы при введении новой записи в бд у меня они переставлялись.

То есть при наличии 7 записей я ввожу 8-ю и указываю что бы ее порядковый номер был 3, а все остальные записи в БД, включая текущую третью и выше, обновляли порядковый номер на num + 1.

Вот пока так сделано:
Код

        $last = $nuw - 1;
        $new_num = $num;
        $sql = "select * from faq where faq_num > '$last'";
        $result = mysql_query($sql);
        while ($row = mysql_fetch_array($result)) {
            $new_num = $row["faq_num"] + 1;
            $id_num = $row["faq_id"];
                $sql2 = "update faq set faq_num = '$new_num' where faq_id = '$id_num'";
                mysql_query($sql2);
        }
        $sql = "insert into faq values(null, '$question', '$answer', '$num')";
        mysql_query($sql);
        echo "<meta http-equiv='refresh' content='0; url=main.php?show=addfaq'>\n";

$num - это получаемый номер записи из формы добавления записи.
Тут несколько лишних записей которые можно изменить, но должно работать помоему. А не работает. Он присваивает новой записи тот порядковый номер который я указываю, а остальные записи получают последний, тот который должен был быть у этой если бы я не поменял. 

Автор: Gold Dragon 22.7.2006, 14:42
Spectre, что-то я не понял.. а в чём проблема то.. тебе нужно именно чтобы в `num` всё переименовать или чтоб выводить в порядку? 

Если только выводить, то достаточно отсортировать по полю `num` и всё, ну плюс добавить какое-нибудь дополнительное поле для сортировки, например `data` (ну чтоб сортировать если будет несколько одинаковых `num`)

а вообще-то это наверное в раздел PHP
вот код, что не понятно, спрашивай
Код

<?php
mysql_connect('localhost', 'root', '') or die("Ошибка соединения");
mysql_query("SET NAMES cp1251;");
mysql_select_db('test');


$num = 3; // новый порядковый номер
$z = "SELECT * FROM `qq` WHERE `num`>=".$num." ORDER BY num";
$r = mysql_query($z);
$a = mysql_num_rows($r);

// читаем в переменную выборку
if($a>0){
    for($i=0; $i<$a; $i++){
        $f = mysql_fetch_array($r);
        $rez[$i]['num'] = $f['num'];
        $rez[$i]['id'] = $f['id'];
    }
}
// изменяем в базе `num` на `num`+1
for($i=0; $i<$a; $i++){
    $new_num = $rez[$i]['num'] + 1;
    $z = "UPDATE `qq` SET `num`=".$new_num." WHERE `id`=".$rez[$i]['id'];
    $r = mysql_query($z);
}
// вставляем новую строку с $num
$z = "INSERT INTO `qq` ( `id` , `num` , `text` )
        VALUES ('', '".$num."', 'текст')";
    $r = mysql_query($z);
?>

 

Автор: Spectre 22.7.2006, 15:49
Отсортировать по num не проблема... num у меня всегда должен быть уникальным. Но при этом если я при введении нового вопроса указываю уже существующий num, то он должен выдать этому вопросу этот номер, а все вопросы последующие, и тот который заменили должны сдвинуться на единицу вперед. Был 2 стал 3 и т.д.
Как составить такой запрос. 

Автор: Gold Dragon 22.7.2006, 17:30
как сделать всё это одним запросом пока не представляю... что-то не выходит... а на PHP я тебе написал, вроде всё работает как ты хочешь 

Автор: skyboy 22.7.2006, 21:28
поясни, пожалуйста, id - это уникальное поле? Или ты по нему определяешь, что куда вставлять? Набросай короткий пример лучше - что было и как стало.... 

Автор: Spectre 22.7.2006, 21:39
id у меня уникален и я не по нему определяю...
Пример такой
У меня есть таблицв. id / body / num
id - уникален и имеет свойство auto_incriment или как там. Второй ряд содержит то что надо выводить на экран. А третий - порядок в котором выводить. Там числовое значение.
Забиваю базу через форму на страничке сайта. При этом у меня автоматически высчитывается значение поля num что бы не повторялось.
Допустим забил в базу 5 значений... получилось у меня num от 1 до 5. Теперь я забиваю значение шестое.. но мне надо, что бы оно было не шестым по порядку а например вторым... В форме я меняю автоматом поставленную 6-ку на 2.
Нажимаю "Добавить" и мне надо что бы он сместил во всех записях от 2 до 5 значение поля num на 1. А потом вставил 6-ю запись со значением num = 2... 
А поле с id = 2, то есть второе забитое, у которого раньше и num = 2 обновилось. Там num теперь 3. так же и с остальными до конца таблицы. 

Было до

id / body / num

1 / а / 1
2 / б / 2
3 / в / 3

Ввожу новую строку:

4(автоматом, я не могу изменить) / г/ 2(сам поменял. Предлагало 4)

Получается:

1 / а / 1
2 / б / 3
3 / в / 4
4 / г / 2 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)