MySQL как узнать соседние поля?

12 3
FFFFx029A
На сайте с 01.09.2007
Offline
142
3666

Всем доброго времени суток.. Может кто знает.., как в MySQL узнать соседние строки?

Кпримеру есть таблица с полями ID,NAME, VIEWS, RATE

нужно узнать соседние строки учитывая то что ID идет не подряд и с учётом сортировки по полю VIEWS

Возможно есть чтото кроме

SELECT * FROM TABLE WHERE `views`<78 LIMIT 1

SELECT * FROM TABLE WHERE `views`>78 LIMIT 1

http://www.youtube.com/watch?v=Gyl4E4EcPdc (http://www.youtube.com/watch?v=Gyl4E4EcPdc) - партнёрка от Мавроди и МММ))) http://miniwm.ru/soft.php?read=917 (http://miniwm.ru/soft.php?read=917) CMS MiniWM v2.8 - 49.99$
T.R.O.N
На сайте с 18.05.2004
Offline
314
#1
FFFFx029A:
нужно узнать соседние поля учитывая то что ID идет не подряд и с учётом сортировки по полю VIEWS

А что мешает считать структуру таблицы?

select colname

from syscolumns

where tabid = (select tabid from systables where tabname = 'tablename');

или типа select * from mytable where 1=0

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
FFFFx029A
На сайте с 01.09.2007
Offline
142
#2
T.R.O.N:
А что мешает считать структуру таблицы?
select colname
from syscolumns
where tabid = (select tabid from systables where tabname = 'tablename');

или типа select * from mytable where 1=0

Сорри, недавно проснулся и толком криво поставил вопрос.., нужно найти соседние строки и желательно 1м запросом..

N
На сайте с 06.05.2007
Offline
419
#3
FFFFx029A:

Возможно есть чтото кроме
SELECT * FROM TABLE WHERE `views`<78 LIMIT 1
SELECT * FROM TABLE WHERE `views`>78 LIMIT 1

нету и даже это неправильно.

нужна двойная сортировка order by views,primary_id и условие primary_id>NNN чтобы полностью стабилизировать порядок.

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

Кнопка вызова админа ()
FFFFx029A
На сайте с 01.09.2007
Offline
142
#4
netwind:
нету и даже это неправильно.
нужна двойная сортировка order by views,primary_id и условие primary_id>NNN чтобы полностью стабилизировать порядок.

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

ну кпримеру нам известен основной ID, эт 14 и поле VIEWS у него равно 78, узнать соседние поля вполне можно узнать так:

SELECT * FROM TABLE WHERE `views`<78 LIMIT 1

SELECT * FROM TABLE WHERE `views`>78 LIMIT 1

Но тогда если значение views ещё у нескольких полей будет 78, то мой вариант не сработает.. Вот собственно полез на форум..

netwind По поводу двойной сортировки, чтото не пойму зачем order by views,primary_id и условие primary_id>NNN, что тут стабилизировать? Соседний primary_id может быть 1 и может быть 999 и условие primary_id>NNN тут явно невтему..

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

Ёхан Палыч
На сайте с 07.05.2006
Offline
169
#5

FFFFx029A, вы напишите первоначальный запрос.

SI
На сайте с 19.12.2007
Offline
77
#6

если нужно было узнать только id "соседних" строк, то можно так

SELECT *, id as id_target,
(SELECT id FROM table WHERE id < id_target ORDER BY id DESC LIMIT 1) as id_prev,
(SELECT id FROM table WHERE id > id_target ORDER BY id LIMIT 1) as id_next
FROM table WHERE [условие исходной строки]
рисуем, верстаем, кодим и крутим ...аа, да, еще принимаем заказы (:
N
На сайте с 06.05.2007
Offline
419
#7
Но тогда если значение views ещё у нескольких полей будет 78, то мой вариант не сработает..

netwind По поводу двойной сортировки, чтото не пойму зачем order by views,primary_id и условие primary_id>NNN, что тут стабилизировать? Соседний primary_id может быть 1 и может быть 999 и условие primary_id>NNN тут явно невтему.

вот именно этот случай я и имел ввиду. В вашем запросе sql волен будет выдать в каком угодно порядке поля где view совпадает. Это и нужно стабилизировать добавляя дополнительное да еще и уникальное поле для сортировки. Получаете предсказуемый порядок и все отлично.

FFFFx029A
На сайте с 01.09.2007
Offline
142
#8

Ну вообщем в итоге с затеей листинга, т.е показа соседних записей передумал, нужно было для http://bomz.org

Думаю оно там не нужно, да и нагрузка дополнительная с этими телодвижениями..

SM
На сайте с 12.11.2009
Offline
3
#9

Как вариант выбрать все значения и уже при выборке запоминать предыдущее значение, дождавшись нужного у нас будет предыдущее и нужное и остается всего-лишь пройтись по массиву еще раз и получится следуещее и break. Но так придется все записи выбирать...

или попробовать

SELECT * FROM TABLE WHERE `views`<= 78 or `views`>= 78 LIMIT 3

$before=$row[0];

$current=$row[1];

$next=$row[2];

Pavka
На сайте с 20.05.2005
Offline
82
#10
SergeyMe:
Как вариант выбрать все значения и уже при выборке запоминать предыдущее значение, дождавшись нужного у нас будет предыдущее и нужное и остается всего-лишь пройтись по массиву еще раз и получится следуещее и break. Но так придется все записи выбирать...
или попробовать

$before=$row[0];
$current=$row[1];
$next=$row[2];

Правильней, на мой взгляд, будет:

SELECT * FROM TABLE WHERE `views`= 78-1 LIMIT 3

смысл понятен, надеюсь :)

Без подписи
12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий