Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Последние сообщения
Ответить
1

Сортировка данных HELP

r00t_san

  • ДиЗиГнЕр
  • Пользователь
  • 169
  • Репутация:11 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#1
Добрый день, Уважаемые знатоки! ^_^

Вообщем сразу к делу.
есть функция на php которая принимает POST
данные вливаються в этот пост следующие: "grid_1,gr_16,gr_17,gr_18,grid_2,gr_13,grid_3,"
собственно означают эти данные вот что:
есть таблица: id | group
данные формата grid_* - это group
данные формата gr_* - это id
Надо чтобы таблица апдетилась следующим образом:
grid_1 - gr_16
grid_1 - gr_17
grid_1 - gr_18
grid_2 - gr_13
ну соответственно grid_* и gr_ надо чтобы убирались и оставались только значения.
И еще если после grid_ не идет значений gr_ строка игнорировалась и действий с добавлением в БД не происходило.
тобишь надо запихнуть в цикл функцию вида: $query = "UPDATE table SET `group` = " . $grid . " WHERE id = " . $gr;

Помогите люди добрые кто чем можеть... :helpme:

Если где то нет чего то значит что то где то есть.

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#2
я не понял что имено надо сделать. Но приведу пару примеров может они помогут
можно делать такие запросы, как бы с вложеными математическими операциями
UPDATE table SET `group` = 1 WHERE id = 1 + 1;
а можно делать условие с несколькими значениями а не одним
UPDATE table SET `group` = 1 WHERE id = 16 OR id=17 OR id=18;

Это чисто примеры на шару, так как я не совсем понял в чем именно проблема. Сортировка делается через ORDER BY `field`

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

r00t_san

  • ДиЗиГнЕр
  • Пользователь
  • 169
  • Репутация:11 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#3
Привет Андрей.

Вообщем по полкам разложу:

1. Имеем функцию следующего вида, которая выводит список группы новостей:
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
 54 
 55 
<?php function showgroup ()
{
echo 
"
<script>
$(document).ready(function()
{
$(function()
{
$(\"#list\").sortable({ opacity: 0.8, cursor: 'move', update: function()
{
var order2 = $(this).sortable('toArray').join(',');
                    $.ajax({
                    type: \"POST\",
                    url: \"/group.html\",
                    data: \"update=update\"+\"&grid=\"+order2,
                    success: function(html){
                          $(\"#list\").append(html);
                    }
                });
        }
        });
    });

});
</script>
"
;
echo 
"<div style='float:left;'><a href='#' onclick='groupadd()'><img src='/images/plus_18.gif' border='0'></a></div>
"
;
echo 
"<div class='gr1' id=\"list\">";
$grnsql "SELECT * FROM news_g  ORDER BY id";
$grncon mysql_query ($grnsql);
while(
$row mysql_fetch_array($grncon))
{
echo 
"<div class='gr' id='grid_".$row['id']."'>
<div style='float:left;'><a href='#' onclick='groupdel("
.$row['id'].")'><img src='/images/minus_18.gif' border='0' width='15'></a></div>
   <a href='/tasks/'>"
.$row['name']."</a></div>
"
;

$grsql "SELECT `name`, `ico`, `group`,`id` FROM news WHERE `group`='".$row['id']."' ORDER BY ico ASC";
$grcon mysql_query ($grsql);


while(
$row mysql_fetch_array($grcon))
{
echo 
"<div class='gr_all' id='gr_".$row['id']."'><a href='".$row['id']."' class='gr_link'>
<div class='gr_ico'><img src='"
.$row['ico']."' width='20' absalign='top' border='0'></div>
<div class='gr_text'>|| "
.$row['name']."</div></a></div>";
}
}
echo 
"</div><div class='gr' id='newgrapp' style='display:none;'>";
echo 
"";

echo 
"
<form action='javascript://addgrsub()'><div id='gradd' class='gradd'></div><input type='submit' onclick='addgrsub()' style='display:none;'></form>"
;
}
?>

собственно аякс возможность перетаскивать новости в отдельные группы + сохраняет положение всех элементов в группе в array:
Code:
<script>
$(document).ready(function()
{
$(function()
{
$(\"#list\").sortable({ opacity: 0.8, cursor: 'move', update: function()
{
var order2 = $(this).sortable('toArray').join(',');
                    $.ajax({
                    type: \"POST\",
                    url: \"/group.html\",
                    data: \"update=update\"+\"&grid=\"+order2,
                    success: function(html){
                          $(\"#list\").append(html);
                    }
                });
        }
        });
    });

});
</script>

и передает данные на другую функцию для обработки
вот это собирает var order2 = $(this).sortable('toArray').join(','); - все данные в такой вид: "grid_1,gr_16,gr_17,gr_18,grid_2,gr_13,grid_3,"
где grid - ID группы
gr - id новости
мне надо чтобы эта собранная структура сохраняла данные в таблице в каком порядке идет сортировка в группе.
тобишь данные передаваемые динамические, они изменяються путем перетаскивания элементов из одной группы в другую
например
"grid_1,gr_16,gr_17,gr_18,grid_2,gr_13,grid_3," - это структура вида
Группа 1
Новость 16
Новость 17
Новость 18
Группа 2
Новость 13
Группа 3
пустая

вот эти новости можно перетаскивать из группы в группу и соответственно если например перетащить Новость 16 в Группу 3 то в функцию обработчика будет передаваться стринг такой "grid_1,gr_17,gr_18,grid_2,gr_13,grid_3,gr_16"
Вот эти данные передаються в функцию "обработчика" где мне надо сделать запрос в БД следующего вида... ну если грубо развернуть:
$query = "UPDATE table SET `group` = 1 WHERE id = 17";
$query = "UPDATE table SET `group` = 1 WHERE id = 18";
$query = "UPDATE table SET `group` = 2 WHERE id = 13";
$query = "UPDATE table SET `group` = 3 WHERE id = 16";

И собственно задача состоит в следующем чтобы указать из получаемого стринга что:
{втыкаем первую запись-----------------
a) строка $group = grid_1 = '1';
б) после этой строки если есть gr: $gr = gr_17 = '17';
{$query = "UPDATE table SET `group` = $group WHERE id = $gr";}
закончили втыкать---------}
{втыкаем вторую запись-----------------
a) строка $group = grid_1 = '1';
б) после строки gr_17 если есть gr: $gr = gr_18 = '18';
{$query = "UPDATE table SET `group` = $group WHERE id = $gr";}
закончили втыкать---------}
{втыкаем третью запись-----------------
a) строка $group = grid_2 = '2';
б) после этой строки если есть gr: $gr = gr_13 = '13';
{$query = "UPDATE table SET `group` = $group WHERE id = $gr";}
закончили втыкать---------}

ну и т.д. помоему обьяснил ))))))

P/S: я предполагаю что надо делать какой то array вида:
$grid_1 => $gr_1
$grid_1 => $gr_2
$grid_2 => $gr_3
Но я в них нифига не шарю
:wall:

Отредактировано автором 4 Дек 2010
Если где то нет чего то значит что то где то есть.

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#4
ну я понял что надо сделать. Даже делал такое уже к стати с применением именно sortable:). Но там немного другая история так что пример от туда не поможет. В твоем случае можно для начала превратить строку
grid_1,gr_17,gr_18,grid_2,gr_13,grid_3,gr_16
в масив
 1 
 2 
<?php $str 'grid_1,gr_17,gr_18,grid_2,gr_13,grid_3,gr_16';
$array explode(','$str);?>
Теперь в $array будет
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
<?php $array = array(
    
0  => 'grid_1',
    
1  => 'gr_17',
    
2  => 'gr_18',
    
3  => 'grid_2',
    
4  => 'gr_13',
    
5  => 'grid_3',
    
6  => 'gr_16',
);
?>

Ну а дальше можно отсортировать по категориям и выполнить запросы.
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
<?php $categories = array();
foreach (
$array as $value) {
     if (
strpos($value'grid_') !== false) {
          
$categories[$value] = array();
          
$category = &$categories[$value];
          continue;
     }
    
$category[] = $value;
}
?>
После этого у нас будет массив с ключами имеющими имена категорий а значения это массивы с идишниками в этой категории
 1 
 2 
 3 
 4 
 5 
 6 
<?php $categories = array(
    
'grid_1' => array(
         
=> 'gr_17',
        ....
     ),
);
?>

Добавлено 2010.12.05 00-44

Ну а дальше перебираем удобно отсортированые категории и делаем запросы. Но так выходит много запросов. я бы подумал над оптимизацией. Хотя если это делаеться редко то пох)

Добавлено 2010.12.05 01-13

конкретно апдейтить можно так(примерно, так как структуру таблиц я не знаю)
 1 
 2 
 3 
 4 
 5 
<?php foreach ($categories as $key => $value) {
      foreach (
$value as $id) {
          
$query "UPDATE table SET group=$key WHERE id=$id";
     }
}
?>

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

r00t_san

  • ДиЗиГнЕр
  • Пользователь
  • 169
  • Репутация:11 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#5
При много благодарен Андрей!!! :tanz:
Все заработало, вот недостающий кусок кода, может кому нибудь пригодиться ) :ura: :ura: :ura:

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
<?php if ($_POST['update'] == "update"){
$str2 $_POST['gr'];
$array explode(','$str2);

$categories = array();
foreach (
$array as $value) {
     if (
strpos($value'grid_') !== false) {
          
$categories[$value] = array();
          
$category = &$categories[$value];
          continue;
     }
    
$category[] = $value;
}

 foreach (
$categories as $key => $value) {
      foreach (
$value as $id) {

$group=str_replace ('grid_','',$key);
$nid=str_replace ('gr_','',$id);
$query "UPDATE news SET `group` = " $group " WHERE id = " $nid;
mysql_query($query) or die('Error, insert query failed');
     }
}
?>

Отредактировано автором 5 Дек 2010
Если где то нет чего то значит что то где то есть.

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#6
К стати решил высказать мнение по поводу такого подхода. Как то раз мне надо было сделать что-то вроде этого в нереально пиз...ой базе и я тоже делал запросы в цикле. Так вот в цикле были сотни тысяч итераций, следовательно и запросов столько же. Мой скрипт работал уже пол дня и не выполнил даже половины. Но когда я написал запрос(пизд..ый запрос, который сам все сделает), это было сделано за пол часа.

То есть если есть возможность, лучше написать большой SQL запрос, он отработает в сотни раз быстрее, чем множество отдельных.

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)
1
Сейчас online: 6. Зарегистрированных: 0. Гостей: 6.