SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.02.2010 19:04:13

haykking
Участник
Зарегистрирован: 05.02.2010
Сообщений: 2

Как использовать вместе ORDER BY и GROUP BY ?

Проблема такая : хочу чтобы на сайте отображались лучшие фотки за каждый день , то есть чтобы был вывод фоток по дням и за каждый день отобразить лишь топовую фотку по рейтингу.
Пишу

SELECT * FROM images GROUP BY day ORDER BY rating

Но ничего не выходит , по ходу он только группирует =/

Чтобы лучше понять идею : есть много фоток , эти фотки составляются в подпорки по дню когда они загружены, так вот на главной странице я хочу чтобы было по одной фотке из каждого дня , чтобы нажимали читать далее и он открывал фотки за весь день. Так вот я хочу чтобы эта фотка на главной была топовой за этот день .

Мне кажется тут как-то надо составлять запрос в запросе.

Пробовал :
SELECT *
FROM images i
JOIN (
 SELECT eday, MAX(rating) rating
 FROM images
 GROUP BY eday
) d ON d.rating = i.rating


Но если есть за один день фотки с одинаковым рейтингом то он выводит обе =\

eday - это две последние цифры года + день года то есть пример 10035


Прикрепленные файлы:
Attachment Icon База.JPG, Размер: 21,618 байт, Скачано: 468

Неактивен

 

#2 05.02.2010 19:30:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как использовать вместе ORDER BY и GROUP BY ?

haykking написал:

Пишу

SELECT * FROM images GROUP BY day ORDER BY rating

Но ничего не выходит , по ходу он только группирует =/

Нет, сначала группирует и полученный результат сортирует (в точности как вы его и просили).


haykking написал:

Мне кажется тут как-то надо составлять запрос в запросе.

Пробовал :

SELECT *
FROM images i
JOIN (
 SELECT eday, MAX(rating) rating
 FROM images
 GROUP BY eday
) d ON d.rating = i.rating


Но если есть за один день фотки с одинаковым рейтингом то он выводит обе =\

Мысль верная, но реализация ошибочна.
Вы выбираете те строки из таблицы images i для которых d.rating = i.rating
Т.е. если у вас данные за два дня и в первый максимальный рейтинг был 10, а во втрой 9, то будут выбраны все записи за первый день у которых рейтинг равен 9 или 10, аналогично за второй.
Видимо у вас максимальный рейтинг в разные дни совпадает, поэтому вы и не заметили такой проблемы wink

Нужно объединять по условию (d.rating = i.rating AND d.eday=i.eday) или в сокращенной записи USING(rating,eday)
Это устранит описанную мной проблему, но не решит ту, что вы указали изначально ("если есть за один день фотки с одинаковым рейтингом то он выводит обе ")

Проблема происходит потому, что комбинация (eday,rating) не определяет однозначно строку в таблице images
Можно:
1) Добавить ещё один group by к результирующей выборке
2) Разбить на 2 запроса. Сначала выбираем id нужных записей, потом извлекаем саму информацию.

Неактивен

 

#3 05.02.2010 20:59:24

haykking
Участник
Зарегистрирован: 05.02.2010
Сообщений: 2

Re: Как использовать вместе ORDER BY и GROUP BY ?

Спасибо большое!!

Решил проблему с помощью добавления GROUP BY smile

SELECT *
FROM images i
JOIN (
 SELECT eday, MAX(rating) rating
 FROM images
 GROUP BY eday
) d ON d.rating = i.rating GROUP BY d.eday DESC

Неактивен

 

#4 05.02.2010 21:17:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как использовать вместе ORDER BY и GROUP BY ?

Ну, вот, автор напрягался слова придумывал, а его никто не читает.

Ваш запрос работает неправильно. Последняя группировка выбирает произвольную запись из тех, у которых совпадает d.eday
И не факт, что она будет относится к нужному дню.

Неактивен

 

#5 08.02.2010 13:14:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как использовать вместе ORDER BY и GROUP BY ?

Лично я сматчился на «решил проблему» smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson