добавление индекса (не auto_increment) на единицу больше максимального

Corbie

Guest
добавление индекса (не auto_increment) на единицу больше максимального

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

PHP:
$max_pos_q = mysql_query("SELECT MAX(position) AS max_pos FROM menu WHERE lang='$lang'");
$max_pos = mysql_result($max_pos_q,0);
затем при добавлении новой позиции вставляю $max_pos в поле "position"

догадываюсь, что может быть более простой способ,
кто знает подскажите, ПЛЗ

ЗЫ: огромная просьба к Фанату, если отвечать, то по существу ;)
 

tony2001

TeaM PHPClub
есть вариант сделать всё-таки поле автоинкрементным.
или объяснить хотя бы почему конкретно это нельзя сделать и какую задачу ты решаешь.

с Фанатом общайся в привате.
 

Paxan

Новичёк
Re: добавление индекса (не auto_increment) на единицу больше максимального

Originally posted by Corbie
делаю сие с целью дальнейшей возможности менять местами позицию строки при выводе на экран.
делаю это так

....

догадываюсь, что может быть более простой способ,
кто знает подскажите, ПЛЗ

Более простой и правильный способ - это автоинкремент. А если хочешь менять местами позиции при выводе - заведи еще одно поле, например displayorder, и при выборе делай по нему сортировку.
 

Cougar

Кошак
tony2001
Он же сказал, почему - хочется ему сделать "пользовательский" порядок выборки записей. А поле с auto_increment уже занято - это id (с вероятностью 95%).
 

Corbie

Guest
tony2001
Paxan
народ! у меня уже есть поле auto_increment, и оно используется в совершенно других целях,
вопрос стоит так "есть ли способ проще(или элегантнее) вышеописаного?"

если интересно я потом поле "position" вот так использую, чтоб можно было менять местами строки при выводе

PHP:
if($mov)
{
  if($mov==up)
  {
  $old_position = $position;
  $new_position = $position-1;
  }
  if($mov==down)
  {
  $old_position = $position;
  $new_position = $position+1;
  }
  
  $new_pos_q =  mysql_query("SELECT num1 FROM menu WHERE position=$new_position");
  $change_pos = mysql_result($new_pos_q,0);

  mysql_query("SET AUTOCOMMIT=0");
  mysql_query("BEGIN");

  mysql_query("UPDATE menu SET position=$new_position WHERE position=$old_position AND lang='$lang'");
  mysql_query("UPDATE menu SET position=$old_position WHERE num1=$change_pos AND lang='$lang'");

  if(!mysql_query("COMMIT"))
  {
  echo mysql_error();
  mysql_query("ROLLBACK");

  echo mysql_error();
  }
}
и собственно "num1" и есть поле auto_increment
 

tony2001

TeaM PHPClub
гм.
сортируй по двум полям - сначала по доп.полю, потом по id.
 

Paxan

Новичёк
Originally posted by Corbie
Paxan
народ! у меня уже есть поле auto_increment, и оно используется в совершенно других целях,
Для каких же интересно?

Originally posted by Corbie
вопрос стоит так "есть ли способ проще(или элегантнее) вышеописаного?"
mysql_insert_id, при условии, что твой position меньше твоего автоинкремент поля.
 

Cougar

Кошак
Paxan
Что значит "для каких же"? Я полагаю, что для тех же целей, для которых его используют все - однозначная уникальная идентификация записи в таблице.

mysql_insert_id не пойдёт - не факт, что в авто-инкрементном поле нет "разрывов".
 

SiMM

Новичок
Автор оригинала: Cougar
mysql_insert_id не пойдёт - не факт, что в авто-инкрементном поле нет "разрывов".
А тебе не пофиг ли эти разрывы? Я бы ещё понял, если бы ты сказал "не подойдёт, поскольку никакой вставки перед запросом могло и не быть".
 

Corbie

Guest
Автор оригинала: SiMM
А тебе не пофиг ли эти разрывы? Я бы ещё понял, если бы ты сказал "не подойдёт, поскольку никакой вставки перед запросом могло и не быть".
не пофиг - т.к. см выше... все должно идти подряд

вобщем, это уже отвлеченные темы
топик, похоже мона закрывать
 

SiMM

Новичок
"Подряд" и "наличие пропуска индексов" - взаимонеисключаемы.
1, 3, 5, 10 - это подряд? Ну и что, что там пропуски - всё равно ORDER BY отсортирует, как надо, в порядке возрастания.
 

Yurik

/dev/null
а пойти по мотивам PostGres/sequences? завести доп. таблицу с одним autoincrement полем?
 

fixxxer

К.О.
Партнер клуба
А при удалении записи ты все перенумеровывать собираешься?
 

Cougar

Кошак
fixxxer
Хм.
[sql]UPDATE table_name SET field_value=field_value-1 WHERE field_value>num
[/sql]

Запросто.
 

Yurik

/dev/null
fixxxer это вопрос кому? зачем что-то перенумеровать? удаление записи не влияет на порядок оставшихся записей.
 
Сверху