![]() |
|
Модераторы: skyboy |
![]()
|
|
| bazzjr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 27.12.2007 Где: Россия, Пермь Репутация: нет Всего: 6 |
Всем привет.
Не могу догнать как составить следующий запрос: Имеем таблицу id position 1 2 2 3 3 4 4 5 ... 134 135 Нужен запрос чтобы построить список так, что бы id-1 был первым в списке, id-2 был вторым и так далее. Position служит для того, чтобы указывать какой id идет за ним. Суть вопроса в том, чтобы организовать позиционирование на странице посредством относительных ссылок (а не абсолютных). Т.е. есть другой способ (абсолютный), мы можем выбирать позицию на странице по id, но для этого тогда прийдется делать переборку и переидентификацию каждый раз, когда мы поменяли id у какой-нибудь позиции, т.е. мы хотим переместить 134 запись на 4-ю позицию, тогда присваиваем 134-ой 4-й id а 4-ой записи 5-й id, и далее пере индексация от 6 до 133. Это сообщение отредактировал(а) bazzjr - 5.6.2010, 09:12 |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
oracle
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
для того чтобы переместить 134ю запись на 4ю позицию надо присвоить ей ранг = (3+4)/2=3,5. апдейт хвоста проводить тлько в том случае, если получили значение, которое уже есть в базе. ЧТобы это как можно реже возникало когда не нужно, можно запланировать некое технологическое окно, скажем раз в неделю, когда производить профилактическое переранжирование. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| bazzjr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 27.12.2007 Где: Россия, Пермь Репутация: нет Всего: 6 |
Zloxa, вообщем у меня есть страница PHP, на этой странице генерируется новости посредством "while ($part = mysql_fetch_array($query))"
База MYSQL. Т.е. мне нужно как то определять какую запись тянуть из базы следующей. Т.е. если у меня в таблице: id position 1 2 2 3 3 4 то мне нужно считывать поле position и выводить запись на страницу по id, которая указана в position (если position=2 значит выводим запись id=2, если position=146 значит выводим запись id=146). Надеюсь я понятно объяснил. К сожалению сам я не имею опыта составить данный запрос (мало экспирианса). |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Понято то оно и сразу было. Только вариантов у тебя два Либо ты отказываешья от идеи получить набор данных одним запросом, и в цикле выполняешь запрос после фетча каждой записи. Либо ты отказваешься от идеи хранения идентификатора следующей записи и хранишь некое абстрактное значение, которое определеят порядок сортировки записей. синтаксис MySQL не позволяет получить желаемый тобой результат одним запросом. Это сообщение отредактировал(а) Zloxa - 6.6.2010, 11:48 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Иными словами, тебе нужно хранить связный список. Твоя структура для этого соверщенно не предназначена. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
хм. мне показалось что он связанный и хранит, что и является сутью проблемы, ибо он не может получить набор, отсортированный в порядке следования связями. о как по разному нам привиделась задача. Это сообщение отредактировал(а) Zloxa - 7.6.2010, 08:36 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| bazzjr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 27.12.2007 Где: Россия, Пермь Репутация: нет Всего: 6 |
Akina и Zloxa, если в поняли суть задачи, не могли бы вы подсказать что нужно для реализации?
Я смогу реализовать любую. структуру таблицы, только подскажите... Не хотелось бы делать как рекомендуют тут http://forum.vingrad.ru/forum/topic-302437...ysql-запос.html |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Я пока не понял. И главное, что я не понял - это именно её суть. Вернее, назначение. Если речь о том, что, к примеру, тебе надо по кнопкам "вперёд-назад" осуществить переход на соседнюю запись (т.е. запрос на сервер должен вернуть тебе эту одну соседнюю запись) - это одно, а если тебе нужно вернуть пачку записей заданного количества (возможно, все) в требуемом тебе порядке - это совсем другое. Так что опиши задачу пошире. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| bazzjr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 27.12.2007 Где: Россия, Пермь Репутация: нет Всего: 6 |
Akina, нужно второе, вернуть ПАЧКУ записей определенной последовательности.
Вообщем есть таблица, в ней 1 000 000 записей, и я должен иметь возможность позиционировать эти записи. Т.е. на странице сайта например выводится 10 записей от 567 до 577, у этих записей в таблице(в базе mysql) есть идентификаторы ну например от 567 до 577. Ну а к примеру предлогают способы так, что если мы меняем запись № 5 на например 999 999, то нам нужно пере индексировать(переименовать) все записи от 6 и до 999 998... Вообщем суть проблемы в том, что я не хочу(да и не правильно это будет) переименовывать(перезаписывать) все записи от 6 до 999 998. Есть другое решение - "относительные ссылки" я его называю. Для этого создается доп. поле(position), в котором указываться какая запись за ней следует т.е. id=45 position=67 (значит запись 67 будет выводиться после записи 47). При такой реализации (как мне видится) не будет пере запись всех столбцов в промежутках измененных записей. Это сообщение отредактировал(а) bazzjr - 7.6.2010, 10:38 |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
ты абсолютно не правильно его назваешь. ссылки в приведенном тобой примере чтонинаесть абсолютные.\ Использовать относиттельные ссылки (дополнительное поле order), а правильнее - ранг записи, который определяет порядок записи, тебе как раз таки предложил Барс.
но и получить упорядоченный набор одним запросом ты не сможешь. Добавлено @ 10:51 И правильно предлагают. А мое предложение, озвученное раньше, и проигнорированное вами чуть менее чем полностью, позволяет избежать переиндексации всякий раз, и требует переиндексации лишь изредка. Право же, Ваше настойчивое пренебрежение моей рекомендацией определенно раздражает. Это сообщение отредактировал(а) Zloxa - 7.6.2010, 11:07 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Я когда-то очень давно такое реализовывал, но с маленьким различием. При выполнении вставки/перемещения тоже производился пересчёт ранга, но не для одной записи, а для целого блока записей (в частности, я брал по 12 записей до и после, плюс сама запись, всего 25, то же и для блоков из менее чем 25 записей) равномерно (ранг хранился в single). Несмотря на то, что вставки происходили достаточно часто (порядка 5 тыс. записей в день при базе в 1.5 млн., в т.ч. порядка 200 записей одиночно), да и перемещения нередко (5-10 раз в день, причём блоками по 10-1000 записей), за год необходимость технологического пересчёта так и не наступила. А раз в год выполнялось достаточно серьёзное технологическое обслуживание, которое не могло обойтись без пересчёта. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |