Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> составить запрос выборки 
:(
    Опции темы
bazzjr
Дата 5.6.2010, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
Zloxa
Дата 5.6.2010, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



oracle
Код

select * from table start with id = 1 connect by prior position = id



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 6.6.2010, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(bazzjr @  5.6.2010,  09:03 Найти цитируемый пост)
т.е. мы хотим переместить 134 запись на 4-ю позицию, тогда присваиваем 134-ой 4-й id  а 4-ой записи 5-й id, и далее пере индексация от 6 до 133.

для того чтобы переместить 134ю запись на 4ю позицию надо присвоить ей ранг = (3+4)/2=3,5.
апдейт хвоста проводить тлько в том случае, если получили значение, которое уже есть в базе.
ЧТобы это как можно реже возникало когда не нужно, можно запланировать некое технологическое окно, скажем раз в неделю, когда производить профилактическое переранжирование.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
bazzjr
Дата 6.6.2010, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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).

Надеюсь я понятно объяснил.

К сожалению сам я не имею опыта составить данный запрос (мало экспирианса).
PM MAIL ICQ   Вверх
Zloxa
Дата 6.6.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(bazzjr @  6.6.2010,  06:37 Найти цитируемый пост)
Надеюсь я понятно объяснил.

Понято то оно и сразу было.
Только вариантов у тебя два
Либо ты отказываешья от идеи получить набор данных одним запросом, и  в цикле выполняешь запрос после фетча каждой записи.
Либо ты отказваешься от идеи хранения идентификатора следующей записи и хранишь некое абстрактное значение, которое определеят порядок сортировки записей.

синтаксис MySQL не позволяет получить желаемый тобой результат одним запросом.

Это сообщение отредактировал(а) Zloxa - 6.6.2010, 11:48


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 6.6.2010, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(bazzjr @  5.6.2010,  10:03 Найти цитируемый пост)
Суть вопроса в том, чтобы организовать позиционирование на странице посредством относительных ссылок (а не абсолютных).

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 7.6.2010, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  6.6.2010,  17:40 Найти цитируемый пост)
Иными словами, тебе нужно хранить связный список. 

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

Это сообщение отредактировал(а) Zloxa - 7.6.2010, 08:36


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
bazzjr
Дата 7.6.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: нет
Всего: 6



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

Я смогу реализовать любую. структуру таблицы, только подскажите...

Не хотелось бы делать как рекомендуют тут  http://forum.vingrad.ru/forum/topic-302437...ysql-запос.html
PM MAIL ICQ   Вверх
Akina
Дата 7.6.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(bazzjr @  7.6.2010,  10:57 Найти цитируемый пост)
если в поняли суть задачи

Я пока не понял. И главное, что я не понял - это именно её суть. Вернее, назначение. Если речь о том, что, к примеру, тебе надо по кнопкам "вперёд-назад" осуществить переход на соседнюю запись (т.е. запрос на сервер должен вернуть тебе эту одну соседнюю запись) - это одно, а если тебе нужно вернуть пачку записей заданного количества (возможно, все) в требуемом тебе порядке - это совсем другое.
Так что опиши задачу пошире.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 7.6.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(bazzjr @  7.6.2010,  09:57 Найти цитируемый пост)
не могли бы вы подсказать что нужно для реализации?

мне показалось что тут я это уже сделал


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
bazzjr
Дата 7.6.2010, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
Zloxa
Дата 7.6.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(bazzjr @  7.6.2010,  10:37 Найти цитируемый пост)
 "относительные ссылки" я его называю.

ты абсолютно не правильно его назваешь.
ссылки в приведенном тобой примере чтонинаесть абсолютные.\
Использовать относиттельные ссылки (дополнительное поле order), а правильнее - ранг записи, который определяет порядок записи, тебе как раз таки предложил Барс.
Цитата(bazzjr @  7.6.2010,  10:37 Найти цитируемый пост)
При такой реализации (как мне видится) не будет пере запись всех столбцов в промежутках измененных записей.

но и получить упорядоченный набор одним запросом ты не сможешь.

Добавлено @ 10:51
Цитата(bazzjr @  7.6.2010,  10:37 Найти цитируемый пост)
Ну а к примеру предлогают  способы так, что если мы меняем запись № 5 на например 999 999, то нам нужно пере индексировать(переименовать) все записи от 6 и до 999 998..

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

Это сообщение отредактировал(а) Zloxa - 7.6.2010, 11:07


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 7.6.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Zloxa @  6.6.2010,  01:16 Найти цитируемый пост)
для того чтобы переместить 134ю запись на 4ю позицию надо присвоить ей ранг = (3+4)/2=3,5.
апдейт хвоста проводить тлько в том случае, если получили значение, которое уже есть в базе.
ЧТобы это как можно реже возникало когда не нужно, можно запланировать некое технологическое окно, скажем раз в неделю, когда производить профилактическое переранжирование. 

Я когда-то очень давно такое реализовывал, но с маленьким различием. При выполнении вставки/перемещения тоже производился пересчёт ранга, но не для одной записи, а для целого блока записей (в частности, я брал по 12 записей до и после, плюс сама запись, всего 25, то же и для блоков из менее чем 25 записей) равномерно (ранг хранился в single). Несмотря на то, что вставки происходили достаточно часто (порядка 5 тыс. записей в день при базе в 1.5 млн., в т.ч. порядка 200 записей одиночно), да и перемещения нередко (5-10 раз в день, причём блоками по 10-1000 записей), за год необходимость технологического пересчёта так и не наступила. А раз в год выполнялось достаточно серьёзное технологическое обслуживание, которое не могло обойтись без пересчёта.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.