Обновление нескольких записей

ExcluZZ

Новичок
Обновление нескольких записей

В таблице несколько записей выбираемых условием WHERE

id | sort | bla | bla | bla
2 | 1 | bla | bla | bla
5 | 2 | bla | bla | bla - поле перестает удовлетворять условию WHERE
6 | 3 | bla | bla | bla
8 | 4 | bla | bla | bla
9 | 5 | bla | bla | bla

и теперь запрос таков:
2 | 1 | bla | bla | bla
6 | 3 | bla | bla | bla
8 | 4 | bla | bla | bla
9 | 5 | bla | bla | bla

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

Если в крации как можно обновить таблицу предав определенному столбцу значения от 1 и до .. с интервалом 1

Наиболее интересны методы SQL, посчитать количество строк методами php и пропустить их через цыкл я представляю как.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
ExcluZZ
зачем? Потому как если ты не удаляешь строки, не удовлетворяющие своему where то эта задача пока что лишена смысла.
 

ExcluZZ

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

-~{}~ 29.01.10 11:50:

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
ExcluZZ
дропни колонку и пересоздай ее с автоинкрементом, если тебе надо перенумеровать ее от 1 до n. Но это не есть верно.

У меня, если я тебя правильно понял, похожее реализовано было следующим образом.

id / presentation / name project / inner_priority / outer_priority

Привязка продуктов к проектам, где id - продукт, а presentation - проект-презентация. Есть 2 типа сортировки, внешняя и внутренняя (колонки _priority)
 

ExcluZZ

Новичок
Если я тебя правильно понимаю, то моя задача в твоем случае выглядит так:
тебе нужно перенести продукт из одной призентации в другую, когда ты его перенесешь inner_priority нарушится, в новой призентации можно будет задать inner_priority = максимальное значение(inner_priority) + 1
А как быть с той призентацией из которой ты вынул свой продукт? там же нужно переопределить inner_priority иначе он там будет не попорядку, т.к. ты убрал из презентации один пункт
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
ExcluZZ
То, что там станет inner+1 это да, но то, что у тебя там вылетит, скажем тройка из ряда:
1.2.4.5.6.7. вообще никак не повлияет на работу, потому как скрипт все равсе запросит данные в этом порядке, только без одной вынутой записи.

А так как у меня сортируется все путем AJAX, то при следующем перемещении одной строки вверх-вниз, скрипт получит данные в виде : id1&id4&id2&id5... и полностью пересоздаст сортировку для этой группы, убрав пробелы в колонке с порядком следования элементов. Их просто станет на 1 меньше.
Получим для группы:
id | inner
1 1
2 3
4 2
5 4
 

ExcluZZ

Новичок
что-то мы уходим от темы, мне нельзя чтобы в сортировке внутри раздела были пропуски, нужно чтобы обязательно были подряд числа, т.к. это используется в скрипте который управляет внутренней сортировкой.. я могу упростить задачу которая меня интересует.

как удобнее обновить таблицу

2 | 1 | bla | bla | bla
6 | 3 | bla | bla | bla
8 | 4 | bla | bla | bla
9 | 5 | bla | bla | bla

в таблицу

2 | 1 | bla | bla | bla
6 | 2 | bla | bla | bla
8 | 3 | bla | bla | bla
9 | 4 | bla | bla | bla

(суть во второй колонке)
 

С.

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

ExcluZZ

Новичок
в общем решил все сделать методом php

$old_parent = mysql_query("SELECT все нужные записи ORDER BY `sort`");
$i=0;
while($old_parent_line = mysql_fetch_array($old_parent))
{
$i=$i+1;
mysql_query("UPDATE " моя таблица SET sort='$i' WHERE id='$old_parent_line[id]'");
}
 

prolis

Новичок
А ведь ты был так близок к правильному решению:
Автор оригинала: ExcluZZ
мне нельзя чтобы в сортировке внутри раздела были пропуски, нужно чтобы обязательно были подряд числа, т.к. это используется в скрипте который управляет внутренней сортировкой..
- т.е. результаты этого запроса уйдут в скрипт, который и самостоятельно сможет с помощью $i++ посчитать порядковые номера, безо всяких дополнительных танцев с таблицей
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Код:
Вот тебе решение на чистом sql:

--
-- Структура таблицы `test`
--

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL auto_increment,
  `sort` int(11) NOT NULL,
  `group` int(11) NOT NULL,
  `la` char(25) NOT NULL,
  `lala` char(25) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

--
-- Дамп данных таблицы `test`
--

INSERT INTO `test` (`id`, `sort`, `group`, `la`, `lala`) VALUES
(2, 1, 1, 'wer', 'r'),
(6, 2, 1, 'we', 'rwer'),
(8, 4, 1, 'erty', 'erty'),
(9, 5, 1, 'etry', 'ety'),
(10, 1, 2, 'etr', 'ertttetr');

--
-- Само решение:
--
create temporary table `sort` (
  `id` int(11) NOT NULL,
  `sort` int(11) NOT NULL,
  `newsort` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`newsort`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;


insert into sort (select id, sort, '' from test where `group` = 1);

select * from sort;

update test t1 SET t1.sort = (select newsort from sort t2 WHERE t2.id = t1.id) Where `group` = 1 ;

select * from test;
Общая мысль надеюсь ясна.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
prolis
угу) по идее тут можно было бы слабать триггер какой или процедурку, но я в них не силен особо, потому предпочел дать страждущему путь для размышлений, чтоит ли оно того
 

ExcluZZ

Новичок
я так понимаю куда проще моим способом обойтись, дабы не заниматься мазохизмом?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
ExcluZZ
Ты вчерась просил ковер, ну так я его припер ©

Хотел решение проблемы методами pure SQL - получите распишитесь =)

А уж как тебе там удобнее - сам реши.

Описанный мною метод временных таблиц я применял при расчете статистики пользователей МТС, а не для решения такой задачи, как у тебя. Для тебя вернее будет то, что написал ты. Так как ты понимаешь, что делает твой код. А своего кода ничто не заменит.
 

ExcluZZ

Новичок
да я и как твой работает понимаю) тут вопрос в нагрузке, и в скорости работы, если скажем данных будет много..
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
ExcluZZ
Смотря что подразумевать под нагрузкой.

Временные таблицы - хранятся в памяти mysql сервера очень короткое время и операции с ними очень шустрая штука, даже в пределах нескольких десятков тысяч записей в них.

В твоем случае у тебя еще идет сужение производительности в месте, где ты в цикле используешь mysql_query(). Если уж писать то с использованием prepared statements имхо. Но тут я не силен, на сколько это шустрее обычного mysql_query(). Думаю народ тут подскажет.
 

prolis

Новичок
Эх, не хотел приводить, но наверно придется (с 5 версии):
[sql]
SELECT @rownum:=@rownum+1 rownum, table.* FROM table , (SELECT @rownum:=0)
ORDER BY sort_fld;
[/sql]
 
Сверху