|
|
|
| Подскажите, как можно организовать сортировку строк в таблице MySQL.
Подробнее:
есть таблица block:
id_block int(11) NOT NULL auto_increment,
name_block varchar(60) NOT NULL,
file_block varchar(60) NOT NULL,
pos_block int(11) NOT NULL,
PRIMARY KEY (id_block)
Я хочу перемещать блоки(меню) на сайте соответсвенно вверх или вниз.
Как правильно это реализовать? | |
|
|
|
|
|
|
|
для: kollince
(03.08.2007 в 12:26)
| | Можете сортировать по id
Если нужна сортировка как вы захотите, тогда можно сделать еще 1 цифровой столбец , заносить в него значения скажем 1,2,3,4 и тд и по нему сортировать | |
|
|
|
|
|
|
|
для: Faraon
(03.08.2007 в 12:46)
| | Это все понятно, но как сделать запрос чтобы в этом цифровом столбце значения поменялись
местами т.е. переместить меню вверх или вниз. Получается мне надо знать что стоит после или перед этими значениями. Может примерно так
$query = "select * from block where pos_block<=".$_GET['pos_block']." limit 1"; или я ошибаюсь?
|
| |
|
|
|
|
|
|
|
для: kollince
(03.08.2007 в 13:02)
| | Если Вы хотите данным запросом узнать какие блоки стоят до, то правильно, убрав LIMIT 1. Зачем Вы его в запрос впихнули ? | |
|
|
|
|
|
|
|
для: Faraon
(03.08.2007 в 13:08)
| | Да это неправильно, но как же быть если я хочу сделать" update pos_block where...", чтобы он переместился на одно значение вверх. | |
|
|
|
|
|
|
|
для: kollince
(03.08.2007 в 13:34)
| | У Вас же наверняка есть что-то типа cms для сайта. Можно вывести названия всех блоков а рядом текстовое поле в которое бы выгружалась текущее значение блока
Например:
10 блок "Вася"
20 блок "Петя"
30 блок "Ваня"
меняя позицию у каждого блока Вы и задаете сортировку. Соответственно затем нажимаете кнопку "сохранить". Происходит Update столбца pos_block.
На сайте при выборе сортируйте ORDER BY pos_block | |
|
|
|
|
|
|
|
для: Faraon
(03.08.2007 в 13:41)
| | Спасибо большое! Это очень хорошая мысль! | |
|
|
|
|
|
|
|
для: kollince
(03.08.2007 в 13:48)
| | А по-моему, это неудачная мысль. А что, если юзер возьмет, да и удалит все эти непонятные циферки? Или сделает две, три, четыре одинаковых? Это ненадежно и неявно. Я делаю связанный список. Добавляешь в таблицу поле after. Если это первый элемент, его after равно 0. Если второй - 1 и т.д. Получается, что каждая запись показывает на своего предшественника. Сортировка идет по этому полю. В админку добавляю стрелочки Вверх-вниз. Если вверх, то проверяем не на самом ли верху, а если нет, то предшественнику присваиваем after инициатора, а инициатору - after предшественника. Единственное что, лично у меня получается два запроса, что не радует, конечно. Но MySQL знаю фигово, возможно, есть решение в один запрос. Оптимально вообще сделать after уникальным, но при моем решении в два запроса такой фокус не пройдет, потому что между запросами получатся два одинаковых значения after.
Кстати, мож кто знает, как в таком случае пооптимальнее перемещать записи? | |
|
|
|
|
|
|
|
для: SHAman
(03.08.2007 в 16:23)
| | при организации порядка элементов связным списком, изменение позиции одного элемента, конечно, можно уложить в пару запросов.
Но при этом придется делать довольно много (или один, но весьма неоптимаольный) запросов при выводе объектов - фактически - по числу объектов. Либо загружать вывод SQL-запроса в память целиком и сортировать его средствами php, что тоже не всегда приемлемо. | |
|
|
|
|
|
|
|
для: Trianon
(04.08.2007 в 00:16)
| | Почему, для вывода нужно использовать много запросов? У меня есть табличка, в которой хранятся треки из музыкальных альбомов. Естественно, все треки всех альбомов в одной табличке. И я сделал этот самый after. И треки перемещаются нормально. А при выводе, мне хватает одного запроса, где подставляется только id альбома.
SELECT * FROM `trecks` WHERE `id_album`=$id_album ORDER BY after
|
Или типа того. Может, я, конечно, не все понимаю? | |
|
|
|
|
|
|
|
для: SHAman
(06.08.2007 в 11:50)
| | >Почему, для вывода нужно использовать много запросов?
>>при организации порядка элементов связным списком
В after у Вас хранятся ключи?
величины ключей могут быть не согласованы с позициями в списке | |
|
|
|
|
|
|
|
для: Trianon
(06.08.2007 в 11:52)
| | Так, что-то я не пойму. Связаный список - это когда один элемент его хранит данные о соседнем или соседних. Так?
В after хранится номер предыдущего элемента. Записи могут быть такими:
id | name | after | id_album
=====================
1 | раз | 0 | 1
2 | два | 1 | 1
3 | три | 2 | 1
4 | еще раз | 0 | 2
5 | еще два | 4 | 2
6 | еще три | 5 | 2
|
Пишем
SELECT * FROM `trecks` WHERE `id_album`=$id_album ORDER BY `after`
|
Еще можно в after хранить не id предыдущего элемента, а after предыдущего элемента. То же самое, в принципе, но, так как after не уникальное, то менее надежное. | |
|
|
|
|
|
|
|
для: SHAman
(06.08.2007 в 13:21)
| | Связаный список - это метод хранения списка, при котором поле связи очередного элемента списка хранит ключ предыдущего элемента списка.
теперь представьте себе, что у Вас 4-й элемент следует за 6-м , а 6-й за 5-м. | |
|
|
|
|
|
|
|
для: Trianon
(06.08.2007 в 13:33)
| | Все равно не понимаю в чем проблема...
установить after в 6, где id =4 и альбом = номер альбома
установить минимальный элемент из альбома в 0.
Опять два запроса... А с выводом - вообще нет проблем... Блин, чет я не догоняю подвоха... У меня вот так сделано и работает нормально... без коллизий. Для перемещения элемента вверх-вниз, требуется два запроса простеньких. Для вывода в нужном порядке - один.
Может, покажете, как вы имеете ввиду? Мы, просто, не понимаем друг друга. Или я вас) | |
|
|
|
|
|
|
|
для: SHAman
(06.08.2007 в 15:27)
| | >Может, покажете, как вы имеете ввиду? Мы, просто, не понимаем друг друга. Или я вас)
>>теперь представьте себе, что у Вас 4-й элемент следует за 6-м , а 6-й за 5-м.(я назвал их первичные ключи)
Нарисуйте содержиое таблицы в этом случае. Покажите, как будет выглядеть запрос вывода данных в правильном порядке. Покажите, какой результат он выдаст. | |
|
|
|
|
|
|
|
для: Trianon
(07.08.2007 в 00:53)
| |
Ну так что кто хочет показать как в MySQL реализовать обход дерева :)
А мы посмотрим и оценим!
|
| |
|
|
|