Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выбрать следующую запись...
 
 автор: Artemy   (03.04.2006 в 12:43)   письмо автору
 
 

Сижу и думаю, всю голову сломал! Как выбрать следующую запись, зная ид предыдущей, притом что есть еще упорядочивание по полю 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'

Но так не рабоет.

Может кто подскажет...?! ;-)

   
 
 автор: Trianon   (03.04.2006 в 12:50)   письмо автору
 
   для: Artemy   (03.04.2006 в 12:43)
 

поле rating является уникальным ключом?
Если нет, то name от какой из нескольких записей с одинаковым rating следует добыть?

   
 
 автор: Artemy   (03.04.2006 в 12:54)   письмо автору
 
   для: Trianon   (03.04.2006 в 12:50)
 

Поле rating без уникального ключа!
Нужно добыть name просто следующей записи после этой, у которой известен id.

   
 
 автор: Trianon   (03.04.2006 в 13:00)   письмо автору
 
   для: Artemy   (03.04.2006 в 12:54)
 

В SQL записи не "следуют после", а лежат "внавал". Под следующей записью Вы имеете в виду запись с ближайшим большим id? А id - это первичный ключ?

   
 
 автор: Artemy   (03.04.2006 в 13:08)   письмо автору
 
   для: Trianon   (03.04.2006 в 13:00)
 

Не знаю как сказать словами, покажу на примере!

Данные таблицы:

id name rating
1 Петя 3
2 Вася 3
3 Ваня 4

Я знаю рейтинг Ивана, мне нужно узнать рейтинг Василия.

   
 
 автор: Trianon   (03.04.2006 в 13:23)   письмо автору
 
   для: 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.
Какой ответ от интересующего Вас запроса Вы ожидаете?

   
 
 автор: Artemy   (03.04.2006 в 13:25)   письмо автору
 
   для: Trianon   (03.04.2006 в 13:23)
 

В идеале конечно хотелось бы узнать name и Олега и Петра, в одном запросе.
А вообще хотябы одного из них.

Буду очень Вам благодарен.

   
 
 автор: Loki   (03.04.2006 в 13:30)   письмо автору
 
   для: 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

   
 
 автор: Artemy   (03.04.2006 в 13:33)   письмо автору
 
   для: Loki   (03.04.2006 в 13:30)
 

Не рабатает!

Ошибка №1221
Wrong usage of UNION and ORDER BY

   
 
 автор: Trianon   (03.04.2006 в 13:31)   письмо автору
 
   для: Artemy   (03.04.2006 в 13:25)
 

Не смотря на то, что и у Олега и у Петра рейтинг отличается от Ваниного больше чем у Юры и Вовы? Т.е. порядок по рейтингу несущественен?

   
 
 автор: Artemy   (03.04.2006 в 13:36)   письмо автору
 
   для: Trianon   (03.04.2006 в 13:31)
 

Ой, сорри, не обратил внимания! Нужно выбрать Олега и Юру!
Т.е. упорядочивать сначала по рейтингу, а потом по ИД.

   
 
 автор: Trianon   (03.04.2006 в 13:45)   письмо автору
 
   для: 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ов, но запрос будет выглядеть устрашающе.

   
 
 автор: Artemy   (03.04.2006 в 13:50)   письмо автору
 
   для: Trianon   (03.04.2006 в 13:45)
 

Прощу прощения, забыл сказать. Вложенные запросы не работают.
Иначе я бы не спрашивал!

   
 
 автор: Trianon   (03.04.2006 в 13:52)   письмо автору
 
   для: Artemy   (03.04.2006 в 13:50)
 

А два запроса подряд сделать тоже нельзя?

   
 
 автор: Artemy   (03.04.2006 в 13:55)   письмо автору
 
   для: Trianon   (03.04.2006 в 13:52)
 

Можно, но не желательно! Там и так за время загрузки страницы идет около 10 запросов.

   
 
 автор: Trianon   (03.04.2006 в 14:06)   письмо автору
 
   для: Artemy   (03.04.2006 в 13:55)
 

Совсем без вложенных обойтись не выйдет.
SELECT .. FROM(SELECT ...) as T всяко понадобится.

   
 
 автор: Artemy   (03.04.2006 в 14:58)   письмо автору
 
   для: Trianon   (03.04.2006 в 14:06)
 

Ладно, спасибо за помощь!
Буду думать дальше, скорей всего прийдется воспользоваться 2-мя запросами.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования