[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сортировка данных
anonymouse
Доброе время суток.
Коротко о задаче - проблема в том что я не могу решить как написать алгоритм чтобы все значения что приходят сортировались так как надо и правильно.

И так- у меня есть форма SELECT в ней уже я сортирую как мне надо статьи.
,
Опций принимают значение из таблицы,строка ORDER=INT и по нему выстраиваются потом через JS я их сортирую и отсылаю обратно.


Вот тут и проблема - я не никак не могу додуматься как же мне внести все изменения в БД так чтоб они соответствовали выбранной мной сортировки.



Спустя 9 минут, 48 секунд (9.07.2009 - 19:10) anonymouse написал(а):
Хотя наверное я прогнал - почитаю этот линк может что-то да пригодится _http://docs.com.ru/algoritm_1.php


Хотя там сортировка просто массивов... Если у кого есть идей - плз!!!

Спустя 20 минут, 23 секунды (9.07.2009 - 19:31) kirik написал(а):
Если я все верно понял, то после получения данных от юзера тебе нужно переписать то поле, по которому сортируешь нужными значениями?

Спустя 2 минуты, 53 секунды (9.07.2009 - 19:33) anonymouse написал(а):
Ну это не от юсера - но да ты прав - я получил поля в нужной мне сортировке - и теперь их нужно пересортировать.

Спустя 2 часа, 4 минуты, 55 секунд (9.07.2009 - 21:38) sergeiss написал(а):
Цитата (anonymouse @ 9.07.2009 - 20:00)
Вот тут и проблема - я не никак не могу додуматься как же мне внести все изменения в БД так чтоб они соответствовали выбранной мной сортировки.

Ответ простой и незамысловатый: никак! wink.gif

Причина прстая - что любая сортировка делается при выборе данных из БД.

Спустя 26 минут, 39 секунд (9.07.2009 - 22:05) anonymouse написал(а):
Цитата (sergeiss @ 9.07.2009 - 18:38)
Цитата (anonymouse @ 9.07.2009 - 20:00)
Вот тут и проблема - я не никак не могу додуматься как же мне внести все изменения в БД так чтоб они соответствовали выбранной мной сортировки.

Ответ простой и незамысловатый: никак! wink.gif

Причина прстая - что любая сортировка делается при выборе данных из БД.

А вот тут я с тобой не соглашусь - кажется я нашел способ - пока что его расписал на бумаге - как переведу в код и проверю дам знать. wacko.gif

Спустя 1 час, 7 минут, 28 секунд (9.07.2009 - 23:13) sergeiss написал(а):
Забудь про этот "способ". Данные внутри БД могут быть записаны в произвольном порядке. В частности, если ты что-то изменишь в записи, то она может стать последней.
И единственной возможностью реальной сортировки будет только сортировка при выборке данные, но не при записи.

Спустя 5 часов, 42 минуты, 15 секунд (10.07.2009 - 04:55) anonymouse написал(а):
Цитата (sergeiss @ 9.07.2009 - 20:13)
Забудь про этот "способ". Данные внутри БД могут быть записаны в произвольном порядке. В частности, если ты что-то изменишь в записи, то она может стать последней.
И единственной возможностью реальной сортировки будет только сортировка при выборке данные, но не при записи.

Так я и не понял что ты имел введу - скажу так - НА ЗЛО ВРАГАМ Я ЭТО СДЕЛАЛ !!!


И так - я получаю какой-то массив через пост с новой сортировкой.
Что я делаю ? я делаю что-то в роди дампа всех строк что у меня уже есть -
Потом беру ORDER из полученного массива $_POST и ищу его в ДАМПЕ - беру его ID
и обновляю ORDER за счет прохода WHILE ($I) - ведь $i можно считать сортировщиком.

и так до тех пор пока не закончиться массив $_POST;

И так момент истины !!!

КОДЕ


PHP
if(isset($_POST['id_set']))
{
    
$array_id_set=$_POST['id_set'];
    
$array=explode(',',$array_id_set);
    
$q1=mysql_query("SELECT * FROM `site_structure` WHERE `id_p`=0;");
    
// Получаю все массивы
    
while($r1=mysql_fetch_array($q1))
    {
        
$res[] = $r1;
    }
    
// Высота массива
    
$num_rows=mysql_num_rows($q1);
    
    
$i=0;

        while(
$i<$num_rows)
        {
            
$new_order=$array[$i];
            
$j=0;
            while(
$res[$j]['order'] != $new_order)
            {
            
$j++;
            }
            
            
$i++;
            
$id=$res[$j]['id'];
            
$id_p=$res[$j]['id_p'];
            
$name=$res[$j]['name'];
            
$title=$res[$j]['title'];
            
$desc=$res[$j]['desc'];
            
$text=$res[$j]['text'];
            
$filename=$res[$j]['filename'];
            
$date=$res[$j]['date'];
            
$enable=$res[$j]['enable'];
            
$access_level=$res[$j]['access_level'];
            
$type=$res[$j]['type'];
            
$order=$i;
            
            
            echo 
"id:".$id."   new_order:".$order."<br>";
            
$query=mysql_query("UPDATE `site_structure` SET `order`='$order' WHERE id='$id';");
            
        }

}

Спустя 32 минуты, 30 секунд (10.07.2009 - 05:27) kirik написал(а):
anonymouse
Все верно сделал. Только вот лишние циклы есть. Для пересортировки вполне пойдет такой код:
PHP
if(!empty($_POST['id_set']))
{
    $array = explode(',', $_POST['id_set']);

    for($i = 0, $c = count($array); $i < $c; $i++)
    {
        if(is_numeric($array[$i]))
        {
            // echo 'id: '.$array[$i].'; new_order: '.($i + 1);
            mysql_query("UPDATE `site_structure` SET `order` = ".($i + 1)." WHERE `id` = ".$array[$i]);
        }
    }
}


Можно сделать, чтобы избежать лишних UPDATE запросов так:
PHP
function get_numeric($array)
{
    
$new_array = array();
    for(
$i 0$c count($array); $i $c$i++)
        if(
is_numeric($array[$i]))
            
$new_array[] = $array[$i];
    return 
$new_array;
}

if(!empty(
$_POST['id_set']))
{
    
$array explode(','$_POST['id_set']);
    
$array get_numeric($array); // чистим массив от НЕ числовых значений

    // если в массиве после зачистки что-то осталось
    
if(!empty($array))
    {
        
// достаем пары ID=>позиция для всех сортируемых элементов
        
$query mysql_query("SELECT `id`, `order` FROM `site_structure` WHERE `id` IN(".implode(','$array).")");
        while(
$row mysql_fetch_assoc($query))
        {
            
// если позиция элемента сменилась - записываем изменения
            
if(($pos = (array_search($row['id'], $array) + 1)) != $row['order'])
                
mysql_query("UPDATE `site_structure` SET `order` = {$pos} WHERE `id` = ".$row['id']);
        }
        
mysql_free_result($query);
    }
}

вродь так, не проверял..

Спустя 2 часа, 49 минут, 10 секунд (10.07.2009 - 08:16) sergeiss написал(а):
kirik - может быть, хотя бы ты мне объяснишь, зачем заниматься таким извратом? Или, может быть, лучше объяснить человеку, что он фигнёй занимается, и пудрит мозХ нам тут, и пусть лучше потратит своё время на изучение того, что действительно имеет смысл???????????????????

Цитата (anonymouse @ 10.07.2009 - 05:55)
Так я и не понял что ты имел ввиду - скажу так - НА ЗЛО ВРАГАМ Я ЭТО СДЕЛАЛ !!!

Объясняю. Ты хочешь
Цитата (anonymouse @ 9.07.2009 - 20:00)
додуматься как же мне внести все изменения в БД так чтоб они соответствовали выбранной мной сортировки

А я тебе пытаюсь объяснить, что любая сортировка должна делаться не на этапе записи, а на этапе выборки данных. Для ускорения процесса выборки данных существует такое понятие, как ИНДЕКСЫ.

Спустя 1 час, 23 минуты, 16 секунд (10.07.2009 - 09:40) kirik написал(а):
sergeiss
Тут дело вот в чем (на сколько я понял). Допустим у нас есть 5 новостей:
Код
позиция 1 - новость 1
позиция 2 - новость 2
позиция 3 - новость 3
позиция 4 - новость 4
позиция 5 - новость 5

и нам нужно переставить новости местами, чтобы получилось так:
Код
позиция 1 - новость 3
позиция 2 - новость 2
позиция 3 - новость 4
позиция 4 - новость 1
позиция 5 - новость 5

Для этого нужно отдельное поле с позицией, по которому будем сортировать при выводе, а в него вносим позицию элемента в списке.

Спустя 2 часа, 19 минут, 36 секунд (10.07.2009 - 11:59) anonymouse написал(а):
kirik
Можно вопрос ? сколько ты потратил время на это ?
Я вот сегодня проторчал до 5 утра... сделал и лег спать... 12 дня я на ногах.
Просто интересно )

Я не знаю что ты использовал - а я просто вспомнил увидев примеры что есть сортировки по другим массивам (тобишь делаешь копию и потом уже в оригинале её обновляешь).




Кирик правильно показал - ну если он понял что я имел введу а ты нет... возможно мы просто не поняли друг друга.

Спустя 4 часа, 12 минут, 46 секунд (10.07.2009 - 16:12) kirik написал(а):
Цитата (anonymouse @ 10.07.2009 - 03:59)
сколько ты потратил время на это ?

не много smile.gif Минут 10 где-то.

Цитата (anonymouse @ 10.07.2009 - 03:59)
Я не знаю что ты использовал

Силу эфира вселенной smile.gif


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.