|
|
|
| Спасибо, Cheops, за прошлый ответ, но снова нужна помощь.
Есть таблица вида
(1)
________________
| id | name | pos |
| 1 | АБВ | 10 |
| 2 | ГДЕ | 20 |
| 3 | ЖЗД | 30 |
...................
| 11 | ЭЮЯ | 110 |
id - id номер
name - Имя
pos - сортировочный ключ по убыванию
Так вот, эта таблица может принять следующий вид
(2)
________________
| id | name | pos |
| 1 | АБВ | 12 |
| 2 | ГДЕ | 13 |
| 3 | ЖЗД | 43 |
...................
| 11 | ЭЮЯ | 103 |
Мне нужен хотя бы алгоритм такой функции, которая смогла бы упорядычить Таблицу (2), как таблицу (1). Т.е сделать значение поля pos += 10. | |
|
|
|
|
|
|
|
для: Ziq
(30.09.2005 в 07:06)
| | Гм... а примерно вот так нельзя?
UPDATE table SET pos=id*10;
|
или так:
UPDATE table SET pos=CONCAT(id, '0');
|
| |
|
|
|
|
|
|
|
для: Ziq
(30.09.2005 в 07:06)
| | А зачем именно 10? Ведь основное назначение поля - сортировка и это условие сохраняется... | |
|
|
|
|
|
|
|
для: cheops
(30.09.2005 в 13:06)
| | Понимаете, я делаю CMS, сделал функцию, в которой обязательное условие - это уникальность поля prioritet и parent - раздел. Я приложил функцию, может посмотрите как можно изменить, чтобы избавиться от этого условия.
А именно 10 потому что со временем может оказаться, что между разделами разица в 1, т.е. 3,4,5. Сортировка выполняться будет, но поле с 5 нельзя будет поставить изменением 5 на 4, так как стоит ограничение. А если будет 30,40,50, то достаточно прировнять 50 к 39 и снова произвести упорядочивание.
P.S. В приложенном файле немного лишнего, не обращайте внимания. | |
|
|
|
|
|
|
|
для: Ziq
(30.09.2005 в 19:47)
| | Хм... помоему проще увеличивать на единицу все поля pos больше текущего поля, т.е. имеем позиции
Допустим, необходимо вставить перед 4 новый абзац:
1) Обновляем все записи для которых поле pos >=4
UPDATE tbl SET pos = pos + 1 WHERE pos >= 4
|
2) Осуществляем вставку новой записи
INSERT INTO tbl VALUES(NULL, ... , 4)
|
| |
|
|
|
|
|
|
|
для: cheops
(30.09.2005 в 22:19)
| | Я же прикрепил функцию. Она как раз и не позволит так сделать, потому что при выполнении
UPDATE tbl SET pos = pos + 1 WHERE pos >= 4
|
сработает злаполучный ключ UNIQUE. Или я не прав?
Посмотрите, может можно изменить функцию, чтобы она выполнялась правильно, если даже prioritet'ы равны.
P.S. prioritet = pos(одно и то тоже) | |
|
|
|
|
|
|
|
для: Ziq
(30.09.2005 в 22:50)
| | Да UNIQUE не даст... А почему функция рекурсивная? | |
|
|
|
|
|
|
|
для: cheops
(30.09.2005 в 22:55)
| | Чтобы вывести всю структуру сайта в правильном порядке. Т.е. так
>Анекдоты
->Анекдоты про Вовочку
->Анекдоты про Программистов
>Гороскопы
>Обои
|
А иначе как бы я не пробывал получиться вот так
>Анекдоты
>Гороскопы
>Обои
->Анекдоты про Вовочку
->Анекдоты про Программистов
|
У меня опыта пока мало, может подскажите правильный алгоритм. | |
|
|
|
|
|
|
|
для: Ziq
(01.10.2005 в 07:10)
| | Так, что посмотрите функцию? | |
|
|
|
|
|
|
|
для: Ziq
(01.10.2005 в 19:06)
| | Я её уже несколько раз помотрел :))), но не очень ещё понял - вы бы выложили кусочек дампа, чтобы её можно было запустить, пооптимизировать... просто без структуры базы данных и без самой базы данных можно лишь общие рекомендации давать - работоспособный код, можно только из работоспособного кода получить... | |
|
|
|
|
|
|
|
для: cheops
(01.10.2005 в 23:23)
| | Я Вам по почте переслал дамп (оригинал), не хотелось бы, чтобы он стал достоянием общественности, в целях безопасности.
Заранее огромное спасибо за помощь. | |
|
|
|
|
|
|
|
для: Ziq
(02.10.2005 в 06:56)
| | Так а с какими значениями в первый раз функцию вызывать? | |
|
|
|
|
|
|
|
для: cheops
(02.10.2005 в 14:00)
| | category(0,0); | |
|
|
|
|
|
|
|
для: Ziq
(02.10.2005 в 15:32)
| | Может что-то непонятно в уже написанном коде? | |
|
|
|
|
|
|
|
для: Ziq
(02.10.2005 в 19:39)
| | Всё равно не понимаю зачем привязка к 10 - я изменил их на 10, 20, 30 на 1, 2, 3 - всё работает... | |
|
|
|
|
|
|
|
для: cheops
(02.10.2005 в 20:03)
| | На привязку пока не смотрите, если избавить функцию от того, чтобы она требовала уникальности поля prioritet, то все станет на свои места. | |
|
|
|
|
|
|
|
для: Ziq
(02.10.2005 в 21:01)
| | Не очень понятно, что функция делает - каково её назначение? | |
|
|
|
|
|
|
|
для: cheops
(03.10.2005 в 14:32)
| | Объясняю. Функция предназначена для вывода структуры сайта в виде <select> т.е. так
<select name="name">
<option value="id_razd">>$name_razd</option>
<option value="id_razd">->$name_razd</option>
<option value="id_razd">->$name_razd</option>
<option value="id_razd">-->$name_razd</option>
<option value="id_razd">>$name_razd</option>
</select>
|
> Означает, что этот раздел находиться на самом верхнем уровне. Чем больше "-" тем ниже уровень. Может, что еще не понятно, потому что без Вашей помощи вряд ли что получиться, так как я уже несколько дней парюсь.
Заранее огромное спасибо. | |
|
|
|
|
|
|
|
для: Ziq
(03.10.2005 в 15:48)
| | Вот ваша функция
<?php
include "config.php";
// Функция для выведения раздел любой вложенности из БД
// Значения переменных
// $prioritet - позиция элемента, который сейчас проверяется
// $id_parent - внутри какого раздела искать 0 - самый верхний
echo "<pre>";
category(0,-1);
echo "</pre>";
function category($id_parent,$level=0)
{
// Устанавливаем уровень
$level++;
$query = "select * from dev_category
where id_parent = $id_parent
order by prioritet";
$myq = @mysql_query($query);
if(!$myq) exit(mysql_error());
// Если найдена хоть одна запись - выводим данные
if(mysql_num_rows($myq)>0)
{
while($fet = mysql_fetch_array($myq))
{
$id_category = $fet['id_category'];
$category = $fet['category'];
$id_parent = $fet['id_parent'];
$id_status = $fet['id_status'];
if ($GLOBALS['category_select'] == $id_category) $sele = "selected";
$GLOBALS['a_parent'][$id_parent] = $id_parent;
// Выводим запрос
echo "<option value='$id_category' $sele>".str_repeat("-",$level)."> $category</option>\n";
// Осуществляем рекурсивный вызов для вывода
// подчинённых записей
category($id_category, $level); // Опускаемся на уровень ниже
}
}
}
?>
|
PS Старайтесь избегать более одного рекурсивного вызова и более 3-х вложенных друг в друга фигурных скобок - иначе вас впереди будут ждать недели отладки :))) | |
|
|
|
|
|
|
|
для: cheops
(03.10.2005 в 16:22)
| | Спасибо ОГРОМНОЕ!!! Видимо тот кто сказал: "Все гениальное просто", тоже мучился с функциями :). У Вас код по размеру вдвое меньше моего. Я даже не знал, что можно так ловко. Еще раз спасибо, Вам надо памятник при жизни поставить. | |
|
|
|