Where "biggest" value?

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Where "biggest" value?

Сообщение Хакер » 13.09.2007 (Чт) 22:07

Речь о SQL запросе.

Имеется некоторая таблица, назовём её T. В ней есть поле F и field_id (другие поля нас не интересуют),
В таблица много записей. Значения полня F идут с большим разбросом и не повторяются.

Нужно выбрать запись, с максимальным F.

Ничего кроме
Код: Выделить всё
WHERE something = (SELECT field_id FROM T ORDER BY `F` DESC LIMIT 1)

в голову не пришло.

Мне кажется, что использование подзапроса - не есть хорошо.
Есть ли лучшие альтернативы?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 13.09.2007 (Чт) 23:07

Хм.. А
Код: Выделить всё
SELECT MAX(F) FROM...

Не катит, или я не в теме?

UPD: Уже вижу, что не в теме..
В принципе, можно и SELECT ... FROM ... ORDER BY F.
И взять просто последнюю запись.. Но кажить оно даже хуже твоего вар-та..
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.09.2007 (Чт) 23:20

Наверное не в теме :)

Пример:

Таблица классов, таблица учеников.

нужно получить записи всех классов + наилучшего ученика для каждого класса.

Код: Выделить всё
SELECT c.*, p.*
FROM t_classes c
LEFT JOIN t_pupils p ON p.pupil_id = (
                                       SELECT p2.pupil_id
                                       FROM t_pupils p2
                                       WHERE p2.pupil_class_id = c.class_id
                                       ORDER BY p2.`pupil_rating` DESC
                                       LIMIT 1
                                      )
ORDER BY c.class_id ASC


Другой пример:
Требуется получить список разделов форума + последнее сообщение для каждого раздела (смотрите главную страницу форума).

Код: Выделить всё
SELECT f.*, t.*, p.*
FROM t_forums f
LEFT JOIN t_topics t ON t.topic_forum_id = f.forum_id
LEFT JOIN t_posts p ON p.post_id = (
                                       SELECT p2.post_id                   
                                       FROM t_posts p2
                                       WHERE p2.post_id = t.topic_last_post_id
                                       ORDER BY p2.post_time DESC
                                       LIMIT 1
                                      )
ORDER BY f.forum_id ASC
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.09.2007 (Пт) 8:26

А чем не устраивает "SELECT * FROM T ORDER BY [F] DESC LIMIT 1" :?:
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.09.2007 (Пт) 12:42

Перечитай запрос: :wink:
Код: Выделить всё
SELECT f.*, t.*, p.*
FROM t_forums f
LEFT JOIN t_topics t ON t.topic_forum_id = f.forum_id
LEFT JOIN t_posts p ON p.post_id = (
                                       SELECT p2.post_id                   
                                       FROM t_posts p2
                                       WHERE p2.post_id = t.topic_last_post_id
                                       ORDER BY p2.post_time DESC
                                       LIMIT 1
                                      )
ORDER BY f.forum_id ASC
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.09.2007 (Пт) 21:44

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.09.2007 (Пт) 21:49

Вобщем, оставновился на следующем варинате:
Код: Выделить всё
$sql = "SELECT pt.pt_id,
               pt.pt_name,
               pt.pt_description,
               pt.pt_topics,
               pt.pt_posts,
               
               t.topic_id,
               t.topic_posts,
               t.topic_last_post_id,
               
               p.post_author_id,
               p.post_time,
               
               u.user_name

        FROM `t_partitions` pt
        LEFT JOIN `t_topics` t ON t.topic_id = (
                                                SELECT t2.topic_id
                                                FROM `t_topics` t2
                                                WHERE t2.topic_pt_id = pt.pt_id
                                                ORDER BY t2.topic_last_post_id DESC
                                                LIMIT 1
                                               )
        LEFT JOIN `t_posts` p ON p.post_id = t.topic_last_post_id
        LEFT JOIN `t_users` u ON u.user_id = p.post_author_id
        ORDER BY pt.pt_id ASC";

$db->error_info(EI_CLEAR);
$db->query($sql);
if($db->error_info(EI_NUMBER))


Может быть лучше SELECT MAX(...) заюзать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 14.09.2007 (Пт) 22:53

Вспомни бритву Оккама и заюзай подзапрос, как хотел вначале. А то понаплодил тут... :roll:
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 80

    TopList