Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Упорядочивание данных
 
 автор: Ziq   (30.09.2005 в 07:06)   письмо автору
 
 

Спасибо, 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.

   
 
 автор: Loki   (30.09.2005 в 11:07)   письмо автору
 
   для: Ziq   (30.09.2005 в 07:06)
 

Гм... а примерно вот так нельзя?

UPDATE table SET pos=id*10;

или так:

UPDATE table SET pos=CONCAT(id, '0');

   
 
 автор: cheops   (30.09.2005 в 13:06)   письмо автору
 
   для: Ziq   (30.09.2005 в 07:06)
 

А зачем именно 10? Ведь основное назначение поля - сортировка и это условие сохраняется...

   
 
 автор: Ziq   (30.09.2005 в 19:47)   письмо автору
 
   для: cheops   (30.09.2005 в 13:06)
 

Понимаете, я делаю CMS, сделал функцию, в которой обязательное условие - это уникальность поля prioritet и parent - раздел. Я приложил функцию, может посмотрите как можно изменить, чтобы избавиться от этого условия.

А именно 10 потому что со временем может оказаться, что между разделами разица в 1, т.е. 3,4,5. Сортировка выполняться будет, но поле с 5 нельзя будет поставить изменением 5 на 4, так как стоит ограничение. А если будет 30,40,50, то достаточно прировнять 50 к 39 и снова произвести упорядочивание.

P.S. В приложенном файле немного лишнего, не обращайте внимания.

   
 
 автор: cheops   (30.09.2005 в 22:19)   письмо автору
 
   для: Ziq   (30.09.2005 в 19:47)
 

Хм... помоему проще увеличивать на единицу все поля pos больше текущего поля, т.е. имеем позиции
1
2
3
4
5
6
7

Допустим, необходимо вставить перед 4 новый абзац:
1) Обновляем все записи для которых поле pos >=4
UPDATE tbl SET pos = pos + 1 WHERE pos >= 4

2) Осуществляем вставку новой записи
INSERT INTO tbl VALUES(NULL, ... , 4)

   
 
 автор: Ziq   (30.09.2005 в 22:50)   письмо автору
 
   для: cheops   (30.09.2005 в 22:19)
 

Я же прикрепил функцию. Она как раз и не позволит так сделать, потому что при выполнении

UPDATE tbl SET pos = pos + 1 WHERE pos >= 4 

сработает злаполучный ключ UNIQUE. Или я не прав?

Посмотрите, может можно изменить функцию, чтобы она выполнялась правильно, если даже prioritet'ы равны.

P.S. prioritet = pos(одно и то тоже)

   
 
 автор: cheops   (30.09.2005 в 22:55)   письмо автору
 
   для: Ziq   (30.09.2005 в 22:50)
 

Да UNIQUE не даст... А почему функция рекурсивная?

   
 
 автор: Ziq   (01.10.2005 в 07:10)   письмо автору
 
   для: cheops   (30.09.2005 в 22:55)
 

Чтобы вывести всю структуру сайта в правильном порядке. Т.е. так

>Анекдоты
->Анекдоты про Вовочку
->Анекдоты про Программистов
>Гороскопы
>Обои

А иначе как бы я не пробывал получиться вот так

>Анекдоты
>Гороскопы
>Обои
->Анекдоты про Вовочку
->Анекдоты про Программистов

У меня опыта пока мало, может подскажите правильный алгоритм.

   
 
 автор: Ziq   (01.10.2005 в 19:06)   письмо автору
 
   для: Ziq   (01.10.2005 в 07:10)
 

Так, что посмотрите функцию?

   
 
 автор: cheops   (01.10.2005 в 23:23)   письмо автору
 
   для: Ziq   (01.10.2005 в 19:06)
 

Я её уже несколько раз помотрел :))), но не очень ещё понял - вы бы выложили кусочек дампа, чтобы её можно было запустить, пооптимизировать... просто без структуры базы данных и без самой базы данных можно лишь общие рекомендации давать - работоспособный код, можно только из работоспособного кода получить...

   
 
 автор: Ziq   (02.10.2005 в 06:56)   письмо автору
 
   для: cheops   (01.10.2005 в 23:23)
 

Я Вам по почте переслал дамп (оригинал), не хотелось бы, чтобы он стал достоянием общественности, в целях безопасности.

Заранее огромное спасибо за помощь.

   
 
 автор: cheops   (02.10.2005 в 14:00)   письмо автору
 
   для: Ziq   (02.10.2005 в 06:56)
 

Так а с какими значениями в первый раз функцию вызывать?

   
 
 автор: Ziq   (02.10.2005 в 15:32)   письмо автору
 
   для: cheops   (02.10.2005 в 14:00)
 

category(0,0);

   
 
 автор: Ziq   (02.10.2005 в 19:39)   письмо автору
 
   для: Ziq   (02.10.2005 в 15:32)
 

Может что-то непонятно в уже написанном коде?

   
 
 автор: cheops   (02.10.2005 в 20:03)   письмо автору
 
   для: Ziq   (02.10.2005 в 19:39)
 

Всё равно не понимаю зачем привязка к 10 - я изменил их на 10, 20, 30 на 1, 2, 3 - всё работает...

   
 
 автор: Ziq   (02.10.2005 в 21:01)   письмо автору
 
   для: cheops   (02.10.2005 в 20:03)
 

На привязку пока не смотрите, если избавить функцию от того, чтобы она требовала уникальности поля prioritet, то все станет на свои места.

   
 
 автор: cheops   (03.10.2005 в 14:32)   письмо автору
 
   для: Ziq   (02.10.2005 в 21:01)
 

Не очень понятно, что функция делает - каково её назначение?

   
 
 автор: Ziq   (03.10.2005 в 15:48)   письмо автору
 
   для: 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>

> Означает, что этот раздел находиться на самом верхнем уровне. Чем больше "-" тем ниже уровень. Может, что еще не понятно, потому что без Вашей помощи вряд ли что получиться, так как я уже несколько дней парюсь.

Заранее огромное спасибо.

   
 
 автор: cheops   (03.10.2005 в 16:22)   письмо автору
 
   для: 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-х вложенных друг в друга фигурных скобок - иначе вас впереди будут ждать недели отладки :)))

   
 
 автор: Ziq   (04.10.2005 в 07:01)   письмо автору
 
   для: cheops   (03.10.2005 в 16:22)
 

Спасибо ОГРОМНОЕ!!! Видимо тот кто сказал: "Все гениальное просто", тоже мучился с функциями :). У Вас код по размеру вдвое меньше моего. Я даже не знал, что можно так ловко. Еще раз спасибо, Вам надо памятник при жизни поставить.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования