выбрать соседей в SQL @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 30 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Заголовок сообщения: выбрать соседей в SQL
Сообщение Добавлено: 11 Январь 2007, 20:41:01 
Звиняйте если ну совсем просто.
Можно ли выбрать соседей? чёт не могу догнать :dandy:

вот такая вот структура таблицы к примеру: id | text.
нужно выбрать элемент по id и его ближайших соседей: предыдущую запись и следующую, учитывая order в query.
Если это первая или последняя запись, то одного из соседей не будет... =)
id идут не обязательно по порядку. (опять же order)

Это вообще делается как то? без кучи запросов? и если да то как? или хотябы в каком направлении рыть?

_________________
можно на ТЫ.
gro
новый человек
17
Сообщения: 43
Зарегистрирован: 09.09.06
Сообщение Добавлено: 11 Январь 2007, 21:28:06 
:) :)
Код:
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` — столбец по которому упорядочиваем
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 11 Январь 2007, 22:01:55 
gro, очевидно, ты ошибочно считаешь, что ord содержит уникальные значение. А если они не уникальны, то этот запрос теряет смысл.
Jamakaser Муж.
участник
91
Сообщения: 1163
Зарегистрирован: 26.01.05
Сообщение Добавлено: 11 Январь 2007, 23:04:39 
bE(o0L, order уникальный? Идет по порядку? иначе без вложенных запросов не обойтись.

_________________
Найди кликабельный пиксель -->
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 12 Январь 2007, 00:36:34 
bE(o0L, я бы начал с начала: какую задачу ты решаешь?
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 12 Январь 2007, 04:20:15 
Задача такая.
Есть таблица с целой кучей элементов (6тыщ). Юзер выбирает один произвольный элемент из этой кучи по ID. Я хочу сделать две кнопочки, смотреть следующий элемент, смотреть предыдущий элемент.

order там хитрый такой... гдето проставлен, где то нет, к нему короче говоря привязываться не стоит. (он нужен для принудительных перемещений элемента по списку, ORDER BY `order` DESC, все что имеют order выстраиваются как нужно, остальные за ними от балды :))
Эти элементы юзер может добавить, удалить, поэтому ID не по порядку.

Еслиб было таких элементов сто к примеру, можно было бы делать этакий виртуальный лист из id и смотреть позицию выбранного элемента, но их же там тыщи.

Вобщем, явно ведь можно сделать, тока не понимаю покачто как :dandy:

p.s.
Может както через LIMIT сделать... но как узнать какой номер у элемента выбранного из этого всего большого списка. Вобщем вот

_________________
можно на ТЫ.
Кухан Муж.
соучастник
18
Сообщения: 581
Зарегистрирован: 20.06.05
Откуда: МОСКВА
Сообщение Добавлено: 12 Январь 2007, 10:26:28 
Может тогда подойдут след. запросы:
след:
Код:
SELECT * FROM table WHERE id > 4 ORDER BY id LIMIT 0, 1

пред:
Код:
SELECT * FROM table WHERE id < 4 ORDER BY id LIMIT 0, 1

Эти запросы будут выполняться, когда пользователь нажимает "смотреть следующий элемент" и "смотреть предыдущий элемент" соответственно.

_________________
Какая-то реклама — «HTML» вёрстка.


Последний раз редактировалось Кухан 12 Январь 2007, 12:18:13, всего редактировалось 2 раз(а).
abraitcev
новый человек
6
Сообщения: 165
Зарегистрирован: 28.09.02
Откуда: Murmansk
Сообщение Добавлено: 12 Январь 2007, 10:47:45 
bE(o0L, все это (следующий, предыдущий) называется - работа со списком. Реляционное отношение по умолчанию списком не является, но у Вас есть возможность сделать его таковым, добавить дополнительные атрибуты ( id | text | prev | next ) и следить (триггеры, правила, что у Вас там есть?) за добавленем/удалением записей.
После этого все будет просто :)
gro
новый человек
17
Сообщения: 43
Зарегистрирован: 09.09.06
Сообщение Добавлено: 12 Январь 2007, 11:41:35 

Crazy писал(а):
gro, очевидно, ты ошибочно считаешь, что ord содержит уникальные значение. А если они не уникальны, то этот запрос теряет смысл.


Да я так, в шутку. Если же ord не уникален, то не только запрос, но и сам первоначальный вопрос теряет смысл.
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 12 Январь 2007, 15:43:01 
abraitcev, этот путь понятен, логичен но не реален в данном случае :dandy:

Кухан, вот уже ближе , проблема в том что ID > 4 может быть предыдущим элементом из за этого вот order`a …

gro, ты прочти вопрос ещо раз :D

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

_________________
можно на ТЫ.
Кухан Муж.
соучастник
18
Сообщения: 581
Зарегистрирован: 20.06.05
Откуда: МОСКВА
Сообщение Добавлено: 12 Январь 2007, 16:39:44 

bE(o0L писал(а):
Кухан, вот уже ближе , проблема в том что ID > 4 может быть предыдущим элементом из за этого вот order`a …


не совсем ясно, этот id для чего вообще нужен? И если не он отвечает за порядок следования, то как тогда определяется порядок записей?

_________________
Какая-то реклама — «HTML» вёрстка.
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 12 Январь 2007, 16:58:16 
Кухан, id уникален, на нём завязано куча всякого, он может отвечать за порядок следования если не выбирать по `order`. Для упорядочивания записей менять их id это нонсенс, поэтому есть поле order... так же поле с датой создания, по ней тоже идёт выбор... Я думал, может есть приёмы, по которым на условиях выбокри узнаётся порядковый номер элемента в таблице =)

_________________
можно на ТЫ.
Кухан Муж.
соучастник
18
Сообщения: 581
Зарегистрирован: 20.06.05
Откуда: МОСКВА
Сообщение Добавлено: 12 Январь 2007, 17:06:06 

bE(o0L писал(а):
Я думал, может есть приёмы, по которым на условиях выбокри узнаётся порядковый номер элемента в таблице =)


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

я все равно не понял, как они у тебя сортируются...

попробуй поэксперемнтировать с ORDER BY, напр.
Код:
ORDER BY order, time, id
или вообше удали его, в этом случае записи будут выведены в том порядке, в каком они в базе

_________________
Какая-то реклама — «HTML» вёрстка.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 12 Январь 2007, 17:09:45 
Кухан, есть мнение, что ты не понял обсуждаемого вопроса. :)
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 12 Январь 2007, 17:19:12 
Кухан, ну к примеру вот структура: :)

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 раз.
Кухан Муж.
соучастник
18
Сообщения: 581
Зарегистрирован: 20.06.05
Откуда: МОСКВА
Сообщение Добавлено: 12 Январь 2007, 17:20:16 

Crazy писал(а):
Кухан, есть мнение, что ты не понял обсуждаемого вопроса. :)


Кухан писал(а):
я все равно не понял, как они у тебя сортируются...


_________________
Какая-то реклама — «HTML» вёрстка.
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 12 Январь 2007, 17:22:31 
ну щас то уже должно быть понятно :dandy:

_________________
можно на ТЫ.
Кухан Муж.
соучастник
18
Сообщения: 581
Зарегистрирован: 20.06.05
Откуда: МОСКВА
Сообщение Добавлено: 12 Январь 2007, 17:32:45 
теперь вроде понял

может первым запросом узнать значение 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

_________________
Какая-то реклама — «HTML» вёрстка.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 12 Январь 2007, 17:36:53 
Кухан, твоя ошибка описана в 3-м сообщении треда.
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 12 Январь 2007, 17:41:42 
ща попробую =))

_________________
можно на ТЫ.
Кухан Муж.
соучастник
18
Сообщения: 581
Зарегистрирован: 20.06.05
Откуда: МОСКВА
Сообщение Добавлено: 12 Январь 2007, 17:43:31 
Crazy, ну если order не уникален, то заменяем строгое неравенство на нестрогое и сортируем по двум полям: order, id

_________________
Какая-то реклама — «HTML» вёрстка.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 12 Январь 2007, 17:50:29 
Кухан, если просто заменить на нестрого и изменить order by, то шутка с limit 0,1 не сработает.
Кухан Муж.
соучастник
18
Сообщения: 581
Зарегистрирован: 20.06.05
Откуда: МОСКВА
Сообщение Добавлено: 12 Январь 2007, 18:00:04 
Crazy, я лишь показал в какую сторону копать, исправить запрос легко.

_________________
Какая-то реклама — «HTML» вёрстка.
Jamakaser Муж.
участник
91
Сообщения: 1163
Зарегистрирован: 26.01.05
Сообщение Добавлено: 12 Январь 2007, 18:36:38 

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
новый человек
6
Сообщения: 165
Зарегистрирован: 28.09.02
Откуда: Murmansk
Сообщение Добавлено: 12 Январь 2007, 19:10:15 
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 Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 12 Январь 2007, 21:19:56 
Jamakaser, ну там же написано - смотри внимательней :D

Впринципе понятно :dandy: прямого пути нет.
придётся с бубном :D

_________________
можно на ТЫ.
Jamakaser Муж.
участник
91
Сообщения: 1163
Зарегистрирован: 26.01.05
Сообщение Добавлено: 13 Январь 2007, 13:26:27 
Код:
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
новый человек
17
Сообщения: 43
Зарегистрирован: 09.09.06
Сообщение Добавлено: 13 Январь 2007, 15:43:48 
Заранее пардон за флуд.

Имеем таблицу:
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 Муж.
участник
91
Сообщения: 1163
Зарегистрирован: 26.01.05
Сообщение Добавлено: 13 Январь 2007, 15:48:04 

Цитата:
Упорядочивая по ord можем получить 2 различных результата:



Если id auto_increment два разных результата мы не получим.

_________________
Найди кликабельный пиксель -->
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 15 Январь 2007, 20:09:17 
Jamakaser, :yes: auto_increment конечно же
gro, задача корректна.

Пришлось создавать кэш списки позиций элемета. При плотном графике посещений, немнога подгружает файловую систему, вроде пока не критично. Пошёл учить матчасть по всяческим бд, может где наткнусь на решение :dandy:

с п а с и б о

_________________
можно на ТЫ.
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 30 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100