|
Страница 1 из 1 [ Сообщений: 30 ] |
Автор |
Сообщение |
bE(o0L
постоянный участник
|
|
Звиняйте если ну совсем просто.
Можно ли выбрать соседей? чёт не могу догнать
вот такая вот структура таблицы к примеру: id | text.
нужно выбрать элемент по id и его ближайших соседей: предыдущую запись и следующую, учитывая order в query.
Если это первая или последняя запись, то одного из соседей не будет... =)
id идут не обязательно по порядку. (опять же order)
Это вообще делается как то? без кучи запросов? и если да то как? или хотябы в каком направлении рыть?
_________________ можно на ТЫ.
|
|
|
|
|
gro
новый человек
|
|
Код: select * from `table` where `ord`>= ( select max(`ord`) from `table` where `ord`< ( select `ord` from `table` where `id`=4 ) ) order by `ord` asc limit 0,3
4 — id центрального элемента
`ord` — столбец по которому упорядочиваем
|
|
|
|
|
Jamakaser
участник
|
|
bE(o0L, order уникальный? Идет по порядку? иначе без вложенных запросов не обойтись.
_________________ Найди кликабельный пиксель -->
|
|
|
|
|
bE(o0L
постоянный участник
|
|
Задача такая.
Есть таблица с целой кучей элементов (6тыщ). Юзер выбирает один произвольный элемент из этой кучи по ID. Я хочу сделать две кнопочки, смотреть следующий элемент, смотреть предыдущий элемент.
order там хитрый такой... гдето проставлен, где то нет, к нему короче говоря привязываться не стоит. (он нужен для принудительных перемещений элемента по списку, ORDER BY `order` DESC, все что имеют order выстраиваются как нужно, остальные за ними от балды )
Эти элементы юзер может добавить, удалить, поэтому ID не по порядку.
Еслиб было таких элементов сто к примеру, можно было бы делать этакий виртуальный лист из id и смотреть позицию выбранного элемента, но их же там тыщи.
Вобщем, явно ведь можно сделать, тока не понимаю покачто как
p.s.
Может както через LIMIT сделать... но как узнать какой номер у элемента выбранного из этого всего большого списка. Вобщем вот
_________________ можно на ТЫ.
|
|
|
|
|
Кухан
соучастник
|
|
Может тогда подойдут след. запросы:
след: Код: SELECT * FROM table WHERE id > 4 ORDER BY id LIMIT 0, 1 пред: Код: SELECT * FROM table WHERE id < 4 ORDER BY id LIMIT 0, 1
Эти запросы будут выполняться, когда пользователь нажимает "смотреть следующий элемент" и "смотреть предыдущий элемент" соответственно.
Последний раз редактировалось Кухан 12 Январь 2007, 12:18:13, всего редактировалось 2 раз(а).
|
|
|
|
|
abraitcev
новый человек
|
|
bE(o0L, все это (следующий, предыдущий) называется - работа со списком. Реляционное отношение по умолчанию списком не является, но у Вас есть возможность сделать его таковым, добавить дополнительные атрибуты ( id | text | prev | next ) и следить (триггеры, правила, что у Вас там есть?) за добавленем/удалением записей.
После этого все будет просто
|
|
|
|
|
gro
новый человек
|
|
Crazy писал(а): | gro, очевидно, ты ошибочно считаешь, что ord содержит уникальные значение. А если они не уникальны, то этот запрос теряет смысл. |
Да я так, в шутку. Если же ord не уникален, то не только запрос, но и сам первоначальный вопрос теряет смысл.
|
|
|
|
|
bE(o0L
постоянный участник
|
|
abraitcev, этот путь понятен, логичен но не реален в данном случае
Кухан, вот уже ближе , проблема в том что ID > 4 может быть предыдущим элементом из за этого вот order`a …
gro, ты прочти вопрос ещо раз
Всётаки придётся изза этого ордера создавать этакий виртуальный список idшек, кэшировать его. И опираясь на него вычислять позицию элемента. вот жеж блин.
_________________ можно на ТЫ.
|
|
|
|
|
Кухан
соучастник
|
|
bE(o0L писал(а): | Кухан, вот уже ближе , проблема в том что ID > 4 может быть предыдущим элементом из за этого вот order`a … |
не совсем ясно, этот id для чего вообще нужен? И если не он отвечает за порядок следования, то как тогда определяется порядок записей?
|
|
|
|
|
bE(o0L
постоянный участник
|
|
Кухан, id уникален, на нём завязано куча всякого, он может отвечать за порядок следования если не выбирать по `order`. Для упорядочивания записей менять их id это нонсенс, поэтому есть поле order... так же поле с датой создания, по ней тоже идёт выбор... Я думал, может есть приёмы, по которым на условиях выбокри узнаётся порядковый номер элемента в таблице =)
_________________ можно на ТЫ.
|
|
|
|
|
Кухан
соучастник
|
|
bE(o0L писал(а): | Я думал, может есть приёмы, по которым на условиях выбокри узнаётся порядковый номер элемента в таблице =) |
в таблице записи расположены в случайном порядке
я все равно не понял, как они у тебя сортируются...
попробуй поэксперемнтировать с ORDER BY, напр. Код: ORDER BY order, time, id или вообше удали его, в этом случае записи будут выведены в том порядке, в каком они в базе
|
|
|
|
|
bE(o0L
постоянный участник
|
|
Кухан, ну к примеру вот структура:
id | order | text
-------------------
1 | 1 | tretij
2 | 2 | vtoroj
3 | | poslednij 1
4 | | poslednij 2
5 | | poslednij 3
6 | 99 | budet pervim
query: select id,text from table ORDER BY `order` DESC
и тут, узер взял и выбрал элемент по id. query: select id,text from table where id=2
значит следующий элемент будет с id:1 а предыдущий с id:6
Вот как это узнать ?
Так понятней может?
_________________ можно на ТЫ.
Последний раз редактировалось bE(o0L 12 Январь 2007, 17:21:42, всего редактировалось 1 раз.
|
|
|
|
|
bE(o0L
постоянный участник
|
|
ну щас то уже должно быть понятно
_________________ можно на ТЫ.
|
|
|
|
|
Кухан
соучастник
|
|
теперь вроде понял
может первым запросом узнать значение order для заданного id
если order пустой, то след. элемент находим так:
Код: SELECT * FROM table WHERE id > 4 ORDER BY id LIMIT 0, 1 если order какое-то число, то Код: SELECT * FROM table WHERE order < 2 ORDER BY order DESC LIMIT 0, 1
|
|
|
|
|
bE(o0L
постоянный участник
|
|
ща попробую =))
_________________ можно на ТЫ.
|
|
|
|
|
Jamakaser
участник
|
|
bE(o0L писал(а): | Кухан, ну к примеру вот структура: id | order | text ------------------- 1 | 1 | tretij 2 | 2 | vtoroj 3 | | poslednij 1 4 | | poslednij 2 5 | | poslednij 3 6 | 99 | budet pervim query: select id,text from table ORDER BY `order` DESC и тут, узер взял и выбрал элемент по id. query: select id,text from table where id=2 значит следующий элемент будет с id:1 а предыдущий с id:6 Вот как это узнать ? Так понятней может? |
Э-э-э, Вы понимаете в каком порядке получите данные по запросу select id,text from table ORDER BY `order` DESC?
_________________ Найди кликабельный пиксель -->
|
|
|
|
|
abraitcev
новый человек
|
|
bE(o0L, это работает, но боюсь опять не в Вашем случае
Код: create temp sequence "npp" start 1; -- Нумеруем записи select nextval('npp') as npp, * into temp "order" from "table" order by …; -- Выбираем СОСЕДЕЙ для ID=NNN select * from "order" where (select npp from "order" where id=NNN) between npp-1 and npp+1;
|
|
|
|
|
bE(o0L
постоянный участник
|
|
Jamakaser, ну там же написано - смотри внимательней
Впринципе понятно прямого пути нет.
придётся с бубном
_________________ можно на ТЫ.
|
|
|
|
|
Jamakaser
участник
|
|
Код: SELECT * from table WHERE id = $id or id IN(SELECT id from table WHERE ord < $ord or (ord = NULL and id < $id) order by ord DESC LIMIT 1) or id = IN(SELECT id from table WHERE ord > $ord or (ord = NULL and id > $id) order by ord DESC LIMIT 1) order by ord DESC
Типа того, не уверен что работает (скорее даже не работает), не пробовал
$id и $ord это от того элемента что нужно выбрать.
_________________ Найди кликабельный пиксель -->
Последний раз редактировалось Jamakaser 13 Январь 2007, 15:48:44, всего редактировалось 1 раз.
|
|
|
|
|
gro
новый человек
|
|
Заранее пардон за флуд.
Имеем таблицу:
id ord
1 4
2 3
3 3
4 2
Упорядочивая по ord можем получить 2 различных результата:
id ord
4 2
3 3
2 3
1 4
id ord
4 2
2 3
3 3
1 4
Пытаясь получить элемент, предшествующий элементу с id=1 можем абсолютно равноправно получить элементы с id=3 или id=2.
Итог — сама изначальная задача не корректна в сугубо теоретическом плане, либо я действительно ничего не понял.
|
|
|
|
|
Jamakaser
участник
|
|
Цитата: | Упорядочивая по ord можем получить 2 различных результата: |
Если id auto_increment два разных результата мы не получим.
_________________ Найди кликабельный пиксель -->
|
|
|
|
|
bE(o0L
постоянный участник
|
|
Jamakaser, auto_increment конечно же
gro, задача корректна.
Пришлось создавать кэш списки позиций элемета. При плотном графике посещений, немнога подгружает файловую систему, вроде пока не критично. Пошёл учить матчасть по всяческим бд, может где наткнусь на решение
с п а с и б о
_________________ можно на ТЫ.
|
|
|
|
|
|
Страница 1 из 1 [ Сообщений: 30 ] |
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
|
|