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

Форум MySQL

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

 

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

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

тема: Как поменять id в таблице?
 
 автор: AlexDIXI   (07.05.2009 в 14:09)   письмо автору
 
 

Есть список имен в Mysql, например:

id 0, Вася
id 1, Петя
id 2, Женя
id 3, Катя
id 4, Саша


Мне нужно вывести их в таблице, ну это не суть, в таблице дать возможность поднять Катю наверх или спустить вниз, таким образом что бы id тоже изменился, например:


//Вверх катю
id 0, Вася
id 1, Петя
id 2, Катя
id 3, Женя
id 4, Саша


Вы заметили у Кати ID уже не 3 а 2.


//Вниз Васю
id 0, Петя
id 1, Вася
id 2, Катя
id 3, Женя
id 4, Саша


И тут у Васи ID не 0 а 1.

Т.е. тот кто был на ID выше что бы ушел вниз а тот кто был на ID ниже что бы ушел вверх. По ID!

Как такое реализовать? Помогите пожалуйста всю голову сломал об стену )

   
 
 автор: Cyrax   (09.05.2009 в 23:34)   письмо автору
 
   для: AlexDIXI   (07.05.2009 в 14:09)
 

Это можно сделать одним запросом.
Что-то подобное я уже делал. Вспомню только...

   
 
 автор: Trianon   (09.05.2009 в 23:47)   письмо автору
 
   для: AlexDIXI   (07.05.2009 в 14:09)
 

если id - первичный ключ, то Вы зря навесили на него задачу сортировки. Введите еще одно поле.

   
 
 автор: Cyrax   (10.05.2009 в 00:02)   письмо автору
 
   для: Trianon   (09.05.2009 в 23:47)
 

Если ввести новое поле, то резонно будет сделать его уникальным. Тут-то встаёт та же самая задача инкремента/декремента значения уникального поля. А это самое интересное...

   
 
 автор: Trianon   (10.05.2009 в 00:33)   письмо автору
 
   для: Cyrax   (10.05.2009 в 00:02)
 

Это как раз делается просто. UPDATE tbl SET pos = $pos1+$pos2 -pos WHERE pos IN ($pos1, $pos2)
А зачем делать его уникальным?

   
 
 автор: Cyrax   (10.05.2009 в 08:26)   письмо автору
 
   для: Trianon   (10.05.2009 в 00:33)
 

[i]>Это как раз делается просто. UPDATE tbl SET pos = $pos1+$pos2 -pos WHERE pos IN ($pos1, $pos2)[/i]
И получим ошибку типа "duplicate unique key".

>А зачем делать его уникальным?
Чтобы на уровне СУБД исключить потенциальные ошибки в коде по сортировке
Ну а если уникальным не делать, то действительно всё просто...

   
 
 автор: Trianon   (10.05.2009 в 08:51)   письмо автору
 
   для: Cyrax   (10.05.2009 в 08:26)
 

 UPDATE tbl SET pos = pos -  ($pos1 + $pos2 ) WHERE pos  IN ( $pos1, $pos2);
 UPDATE tbl SET pos = -pos WHERE pos  IN ( -$pos1, -$pos2);

   
 
 автор: Cyrax   (10.05.2009 в 08:59)   письмо автору
 
   для: Trianon   (10.05.2009 в 08:51)
 

Да, но только pos в таких случаях не только уникален, но ещё и неотрицателен.
А неортицательность необходима по той же причине, что и уникальность.

   
 
 автор: Trianon   (10.05.2009 в 09:10)   письмо автору
 
   для: Cyrax   (10.05.2009 в 08:59)
 

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

   
 
 автор: Cyrax   (10.05.2009 в 09:28)   письмо автору
 
   для: Trianon   (10.05.2009 в 09:10)
 

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

   
 
 автор: Trianon   (10.05.2009 в 11:33)   письмо автору
 
   для: Cyrax   (10.05.2009 в 09:28)
 

1. чем обусловлено требование неотрицательного номера позиции?

2. чем обусловлено требование уникального индекса на поле номера позиции?

   
 
 автор: Cyrax   (10.05.2009 в 11:58)   письмо автору
 
   для: Trianon   (10.05.2009 в 11:33)
 

1. чем обусловлено требование неотрицательного номера позиции?
Исходя из предметной области задачи номер позиции не может быть отрицательным
2. чем обусловлено требование уникального индекса на поле номера позиции?
Исходя из предметной области задачи номера позиций не могут совпадать

   
 
 автор: Trianon   (10.05.2009 в 12:02)   письмо автору
 
   для: Cyrax   (10.05.2009 в 11:58)
 

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

Вопрос закрыт.

   
 
 автор: Cyrax   (10.05.2009 в 12:24)   письмо автору
 
   для: Trianon   (10.05.2009 в 12:02)
 

>А еще он не может быть нулевым, нецелочисленным, неопределеленным
Конечно. Мы ведь фактически имеем дело с порядковым номером.

>не может выходить за множество номеров имеющихся строк.
И тем самым исключить возможность добавления новых элементов в таблицу ?

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

   
 
 автор: Trianon   (10.05.2009 в 12:36)   письмо автору
 
   для: Cyrax   (10.05.2009 в 12:24)
 

>>не может выходить за множество номеров имеющихся строк.
>И тем самым исключить возможность добавления новых элементов в таблицу ?

почему же? Добавление новой строки как раз расширяет область определения позиции на один элемент. Здесь всё в порядке.



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

Проверку уникальности можно вообще не вводить. Поле неключевое.
Вы уж выберите что-нибудь одно.

   
 
 автор: Cyrax   (10.05.2009 в 12:45)   письмо автору
 
   для: Trianon   (10.05.2009 в 12:36)
 

>почему же? Добавление новой строки как раз расширяет область определения позиции на один элемент. Здесь всё в порядке.
Если вводится новый элемент, число уникальный позиций увеличивается. Если будем принимать во внимание требование о неизменности множества значений позиций, мы не сможем добавлять новые элементы.

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

>Вы уж выберите что-нибудь одно.[/i]
Выбираю неключевое, но уникальное и неотрицательное поле.

   
Rambler's Top100
вверх

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