Выборка соседних записей

Лысый

Новичок
Выборка соседних записей

хочу выбрать соседей записи в сортировке по какому-то полю


например, если у меня запись с ценой 100, я хочу выбрать предыдущего по цене и следующего по цене
делаю это
select id from items where price < 100 order by price limit 1
select id from items where price > 100 order by price limit 1

но это не канает если у меня несколько товаров по цене 100 - они все не учитываются
хотел сделать

select id from items where concat (price,id) > '100123' order by price, id limit 1

но какая-то невнятная
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(price,id) > '100123' order by price, id limit 1'

туплю и не могу понять, в чём дело?

Спасибо.
 

MD

Guest
между конкатом и скобкой не должно быть пробела.
CONCAT(... а не CONCAT (...
 

Лысый

Новичок
2 MD
ого! спасибо
такая мелочь, но дело было именно в этом!
2 Фанат
не совсем понял, вроеде как order by price, id
2 Andreika
а при чём тут?
конечно разные
задача не в том чтоб id>123
а чтоб ИД 123 с ценой 100 и ИД 124 с ценой 100 друг от друга отличались
отсюда CONCAT(price,id)>'100123'
хотя видимо правильнее что-то типа CONCAT(price,'_',id)>'100_123'


всем спасибо!
 

Лысый

Новичок
хотя я рано обрадовался
это работало бы если бы я сортировал по строковому аттрибуту, а когда цена в строку переводится - совсем другие алгортимы сравнения работают
получается, что '9e598' > '9272e144' :(

-~{}~ 04.04.06 14:15:

вобщем прошу прощения
перемудрил
рельно проще просто 2 критерия сортировки и поиска использовать
кроме цены, например ИД или имя

получается
SELECT *
FROM items
WHERE price >945
AND name > 'Europa'
ORDER BY price, name



вопрос снят
 

MD

Guest
Лысый, ну вообщем Фанат тебе изначально это посоветовал ... :)
 

Wicked

Новичок
А на таком примере будет работать?
price, id
945, 1
945, 2 - current
945, 3

Я бы сделал так:
... where (price = 945 and id > 2) or (price > 945)
 

Лысый

Новичок
Автор оригинала: MD
Лысый, ну вообщем Фанат тебе изначально это посоветовал ... :)
прошу прощения
рано радовался, Фанат не совсем прав

все же это решение не подходит
пример
запись ИД 10 цена 1000
запись ИД 20 цена 100

я знаю про ИД 20 цена 100
по смыслу должен получить следующую по цене т.е ИД 10
но не получу, так как 10 не больше 20 :(
 

Лысый

Новичок
ты имеешь в виду пост Wicked а?
просто когда я начал набирать ответ, его поста ещё не было, а я долго ковырялся проверяя варианты

в итоге пришёл к тому же что он и посоветовал

теперь ломаю голову вот над чем
когда цена дробная - запрос по записи возвращает саму себя, например

SELECT i.*FROM `items` as i WHERE i.sup = 3 AND i.file =3 AND ( (i.price =474.05 AND i.name < 'SIGMA') OR (i.price < 474.05) ) ORDER BY i.price DESC, i.name DESC LIMIT 1

возвращет ту же самую запись :(
поменял запись и запрос на целое число - работает верно :(
 

Фанат

oncle terrible
Команда форума
а почему i.price =474.05? тебе же надо меньше, а не равно?
 

Лысый

Новичок
2 Фанат
потому что равные по цене сортируются по названию
а если равных нет то берётся та что меньше

это на тот случай, если
ид 1 цена 3
ид 2 цена 5
ид 3 цена 5
ид 4 цена 8

если так не делать. то получится что перед 3им идёт 1ый а не 2ой

______________________________


методом исключения условий я понял, что

мусукл считает, что

WHERE
(
i.price < 284.05
)
удовлетворяется при i.price= 284.5

что за бред?
 

Фанат

oncle terrible
Команда форума
у тебя имена не уникальные ведь?
то ест, теоретически, может сложиться ситуация, когда есть два товара с одинаковой ценой и одинаковым именем?
и как ты предлагаешь их сортировать?

какой смысл сортировать по имени после цены? сортируй по id

и у меня, когда я ткой запрос делал, он был проще...
 

Лысый

Новичок
хорошо
про то, как сортировать равные по первому признаку, это сложный вопрос
с точки зрения мат модели - ты прав, доп. критерий должен быть исчерпывающим, но с точки зрения юзеров, им логичнее, когда равные сортируются по понятному алфавитному признаку, а не по невидимому им ИД, я думаю, эту проблему можно решить добавив просто ORDER BY i.price, i.name, i.id

про более простой запрос - в чём проще?

но самое главное
мой запрос глючит не на (i.price =474.05 AND i.name < 'SIGMA'), а на i.price < 474.05, что меня просто убивает :(

отчего это так? Мускул сравнивает только целые части? тип поля price float
 

Фанат

oncle terrible
Команда форума
с чего это ты взял, что он там глючит.
выполняется первое условие просто,и всё. где =

-~{}~ 04.04.06 17:33:

тип поля price float
блин какой кошмар.

цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL цену надо держать в DECIMAL!
 

Лысый

Новичок
Автор оригинала: Фанат
с чего это ты взял, что он там глючит.
выполняется первое условие просто,и всё. где =
неа

потому что
SELECT price
FROM items
WHERE (
price < 284.05
)
ORDER BY price DESC
LIMIT 0 , 30
в первой строчке даёт
284.05


сижу фигею
 

Фанат

oncle terrible
Команда форума
это очевидно.
про проблему чисел с плавающей запятой тут задают вопрос рстрого раз в неделю.
 

Лысый

Новичок
мля
ну вот такой я пень
форум читаю нерегулярно, а арифметикой в БД давно не сталкивался

спасибо большое
поставил DECIMAL (7,2) и всё случилось

прошу прощения
 
Сверху