|
|
|
| Сижу и думаю, всю голову сломал! Как выбрать следующую запись, зная ид предыдущей, притом что есть еще упорядочивание по полю rating.
Есть одно решение, но оно меня не устраивает, т.к. кроме поля rating нужно еще поле name.
SELECT MAX(rating) FROM table WHERE active='1' AND rating<'5'
UNION
SELECT MIN(rating) FROM table WHERE active='1' AND rating>'5'
|
Хотелось что то вроде этого
SELECT MAX(rating), name FROM table WHERE active='1' AND rating<'5'
UNION
SELECT MIN(rating), name FROM table WHERE active='1' AND rating>'5'
|
Но так не рабоет.
Может кто подскажет...?! ;-) | |
|
|
|
|
|
|
|
для: Artemy
(03.04.2006 в 12:43)
| | поле rating является уникальным ключом?
Если нет, то name от какой из нескольких записей с одинаковым rating следует добыть? | |
|
|
|
|
|
|
|
для: Trianon
(03.04.2006 в 12:50)
| | Поле rating без уникального ключа!
Нужно добыть name просто следующей записи после этой, у которой известен id. | |
|
|
|
|
|
|
|
для: Artemy
(03.04.2006 в 12:54)
| | В SQL записи не "следуют после", а лежат "внавал". Под следующей записью Вы имеете в виду запись с ближайшим большим id? А id - это первичный ключ? | |
|
|
|
|
|
|
|
для: Trianon
(03.04.2006 в 13:00)
| | Не знаю как сказать словами, покажу на примере!
Данные таблицы:
id name rating
1 Петя 3
2 Вася 3
3 Ваня 4
Я знаю рейтинг Ивана, мне нужно узнать рейтинг Василия. | |
|
|
|
|
|
|
|
для: Artemy
(03.04.2006 в 13:08)
| | Мало данных.
id name rating
11 Юра 4
12 Вася 3
13 Олег 5
14 Ваня 4
15 Петя 3
16 Игорь 5
17 Вова 4
| Итак, Вы знаете id Ивана. 14.
Какой ответ от интересующего Вас запроса Вы ожидаете? | |
|
|
|
|
|
|
|
для: Trianon
(03.04.2006 в 13:23)
| | В идеале конечно хотелось бы узнать name и Олега и Петра, в одном запросе.
А вообще хотябы одного из них.
Буду очень Вам благодарен. | |
|
|
|
|
|
|
|
для: Artemy
(03.04.2006 в 13:25)
| | Лобовой вариант такой:
SELECT * FROM table WHERE active='1' AND rating<'5' ORDER BY rating DESC LIMIT 1
UNION
SELECT * FROM table WHERE active='1' AND rating>'5' ORDER BY rating LIMIT 1
|
| |
|
|
|
|
|
|
|
для: Loki
(03.04.2006 в 13:30)
| | Не рабатает!
Ошибка №1221
Wrong usage of UNION and ORDER BY | |
|
|
|
|
|
|
|
для: Artemy
(03.04.2006 в 13:25)
| | Не смотря на то, что и у Олега и у Петра рейтинг отличается от Ваниного больше чем у Юры и Вовы? Т.е. порядок по рейтингу несущественен? | |
|
|
|
|
|
|
|
для: Trianon
(03.04.2006 в 13:31)
| | Ой, сорри, не обратил внимания! Нужно выбрать Олега и Юру!
Т.е. упорядочивать сначала по рейтингу, а потом по ИД. | |
|
|
|
|
|
|
|
для: Artemy
(03.04.2006 в 13:36)
| | Что-то такое:
SELECT *
FROM tab
WHERE id != $id AND abs(rating-$rating) = (
SELECT min(abs(rating-$rating))
FROM tab
WHERE NOT id = $id
) ORDER BY id
|
Можно то же самое на LEFT JOIN написать, и возможно даже обойтись без вложенных в условие WHERE SELECTов, но запрос будет выглядеть устрашающе. | |
|
|
|
|
|
|
|
для: Trianon
(03.04.2006 в 13:45)
| | Прощу прощения, забыл сказать. Вложенные запросы не работают.
Иначе я бы не спрашивал! | |
|
|
|
|
|
|
|
для: Artemy
(03.04.2006 в 13:50)
| | А два запроса подряд сделать тоже нельзя? | |
|
|
|
|
|
|
|
для: Trianon
(03.04.2006 в 13:52)
| | Можно, но не желательно! Там и так за время загрузки страницы идет около 10 запросов. | |
|
|
|
|
|
|
|
для: Artemy
(03.04.2006 в 13:55)
| | Совсем без вложенных обойтись не выйдет.
SELECT .. FROM(SELECT ...) as T всяко понадобится. | |
|
|
|
|
|
|
|
для: Trianon
(03.04.2006 в 14:06)
| | Ладно, спасибо за помощь!
Буду думать дальше, скорей всего прийдется воспользоваться 2-мя запросами. | |
|
|
|