Ответить
1
Сортировка данных HELP
Отправлено: 4 Дек 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;
Помогите люди добрые кто чем можеть...
Вообщем сразу к делу.
есть функция на 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;
Помогите люди добрые кто чем можеть...
Если где то нет чего то значит что то где то есть.
Отправлено: 4 Дек 2010#2
я не понял что имено надо сделать. Но приведу пару примеров может они помогут
можно делать такие запросы, как бы с вложеными математическими операциями
Это чисто примеры на шару, так как я не совсем понял в чем именно проблема. Сортировка делается через ORDER BY `field`
можно делать такие запросы, как бы с вложеными математическими операциями
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 . И люблю нашу команду)
Отправлено: 4 Дек 2010#3
Привет Андрей.
Вообщем по полкам разложу:
1. Имеем функцию следующего вида, которая выводит список группы новостей:
собственно аякс возможность перетаскивать новости в отдельные группы + сохраняет положение всех элементов в группе в array:
и передает данные на другую функцию для обработки
вот это собирает 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
Но я в них нифига не шарю
Вообщем по полкам разложу:
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>
$(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
Но я в них нифига не шарю
Отредактировано автором 4 Дек 2010
Если где то нет чего то значит что то где то есть.
Отправлено: 5 Дек 2010#4
ну я понял что надо сделать. Даже делал такое уже к стати с применением именно sortable. Но там немного другая история так что пример от туда не поможет. В твоем случае можно для начала превратить строку
grid_1,gr_17,gr_18,grid_2,gr_13,grid_3,gr_16
в масив
Теперь в $array будет
Ну а дальше можно отсортировать по категориям и выполнить запросы.
После этого у нас будет массив с ключами имеющими имена категорий а значения это массивы с идишниками в этой категории
Добавлено 2010.12.05 00-44
Ну а дальше перебираем удобно отсортированые категории и делаем запросы. Но так выходит много запросов. я бы подумал над оптимизацией. Хотя если это делаеться редко то пох)
Добавлено 2010.12.05 01-13
конкретно апдейтить можно так(примерно, так как структуру таблиц я не знаю)
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);?>
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(
0 => '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 . И люблю нашу команду)
Отправлено: 5 Дек 2010#5
При много благодарен Андрей!!!
Все заработало, вот недостающий кусок кода, может кому нибудь пригодиться )
Все заработало, вот недостающий кусок кода, может кому нибудь пригодиться )
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
Если где то нет чего то значит что то где то есть.
Отправлено: 8 Янв 2011#6
К стати решил высказать мнение по поводу такого подхода. Как то раз мне надо было сделать что-то вроде этого в нереально пиз...ой базе и я тоже делал запросы в цикле. Так вот в цикле были сотни тысяч итераций, следовательно и запросов столько же. Мой скрипт работал уже пол дня и не выполнил даже половины. Но когда я написал запрос(пизд..ый запрос, который сам все сделает), это было сделано за пол часа.
То есть если есть возможность, лучше написать большой SQL запрос, он отработает в сотни раз быстрее, чем множество отдельных.
То есть если есть возможность, лучше написать большой SQL запрос, он отработает в сотни раз быстрее, чем множество отдельных.
Я горжусь тем, что создал бесплатную CMS - AtomX . И люблю нашу команду)
1
Зарегистрируйтесь или авторизуйтесь что бы писать
Сейчас online: 6. Зарегистрированных: 0. Гостей: 6.