Jump to content
  • 0

Изменение позиции объекта в выдаче.


fiver
 Share

Question

Добрый день!

Не хочу изобретать велосипед, наверняка задача вполне тривиальная и давно известная.

Но вот я не смог найти готового решения, может не те поисковые фразы вводил.

Суть вот в чем.

Есть таблица для фотогалереи из 3 столбцов, id, путь к фото и ПОЗИЦИЯ

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

$query = "SELECT MAX(pos) FROM fotogal_foto";	$num = mysql_query($query);	if($num) $pos = mysql_result($num,0) + 1;

Т.е. нумерация идет 0,1,2,3,4,5 и т.д.

Могут быть разрывы, если какое то фото было удалено. 0,1,2,7,10,11 и т.д.

 

И соответственно есть сортировка по этому полю

SELECT * FROM `fotogal_foto` ORDER BY `pos`

Мне надо прилепить к каждой фотке две кнопки, поднять фото на 1 позицию вверх и сделать фото первым в выдаче.

 

Соответственно нужны 2 функционала.

1. при поднятии на одну позицию, вычисляем предыдущую позицию, поднимаемому фото присваиваем предыдущую, а предыдущему фото текущую позицию. Т.е. у 2-х фото меняет значение pos местами.

 

2. Если перемещаем фото на первую позицию, то соответственно ему присваиваем pos=0 , все остальные значения увеличиваем на 1.

 

Буду благодарен за ссылку на пример, или помощь в решении.

Спасибо!

Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

алгоритм верно описали, что мешает сделать?

 

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

еще я бы сделал на функцию удаления смещение всех идущих после удаляемого элемента на -1

и функцию перемещения на 1 вверх более универсальной, с указанием определенной позиции (может пригодиться вдруг придется поднимать на 1000 пунктов или вообще опускать, да и таким образом можно будет объединить две нужные вам функции в одну)

 

по функциям я представляю что-то типа up_to ну и чтобы сильно не отличалось :) up_del (функции запросов писать подробно не буду, передам только смысл)

 

up_to($pos_old, $pos_new)

$id = SELECT 'id' FROM  'fotogal_foto' WHERE 'pos' = $pos_old;$offset = $pos_old - $pos_new;if($offset > 0){UPDATE 'fotogal_foto' SET 'pos' = 'pos'+1 WHERE 'pos' >= $pos_new AND 'pos' < $pos_old;UPDATE 'fotogal_foto' SET 'pos' = $pos_new WHERE 'id' = $id;}elseif($offset < 0){UPDATE 'fotogal_foto' SET 'pos' = 'pos'-1 WHERE 'pos' <= $pos_new AND 'pos' > $pos_old;UPDATE 'fotogal_foto' SET 'pos' = $pos_new WHERE 'id' = $id;}

получается при нажатии кнопки вам достаточно передавать две переменные: $pos_old - текущая позиция, $pos_new новая позиция (для упрощения ваших нужд можно в функции объявить переменную по умолчанию $pos_new = $pos_old - 1)

 
up_del($pos_old)
DELETE FROM 'fotogal_foto' WHERE 'pos' = $pos_old;UPDATE 'fotogal_foto' SET 'pos' = 'pos'-1 WHERE 'pos' > $pos_old;
надеюсь идея понятна
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy