2 таблицы, 2 сортировки

Yura123

Новичок
2 таблицы, 2 сортировки

Ребята, здравствуйте.

Есть довольно тривиальная задача, но решения, почему-то, не вижу.

2 таблицы:

movies
------------------
id
name
voites_average - средний балл
voites_count - кол-во голосований за фильм


board (обсуждения фильмов)
------------------
id
movie_id - ссылка на таблицу movies
text - текст сообщения
tdate - дата обсуждения


Задача в том, что нужно выбрать 10 наиболее обсуждаемых фильмов (те, у которых больше всего записей в таблице board) и отсортировать их по movies.voites_average.


Такой запрос:

SELECT m.name, m.voites_average, m.voites_count, COUNT(b.movie_id) AS talks FROM movies m, board b WHERE m.id = b.movie_id GROUP BY m.id ORDER BY talks DESC, m.voites_average DESC LIMIT 0, 10

сортирует по количеству обсуждений верно, но неверно по среднему балу.
Как решить задачу?

Заранее спасибо.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Какие данные возвращает этот запрос?

-~{}~ 13.04.07 15:41:

Точнее значения полей talks и voites_average
 

Yura123

Новичок
"Шакал";4.08;3471;5
"Однажды в Мексике";4.18;674;4
"Матрица-3";4.15;1671;4
"Люди в черном";1.75;53;4
"Санта-барбара";1.14;432;4

Т.е., должно быть так:
Из таблицы board мы забираем 10 айди фильмов (movie_id), на которые в этой таблице больше всего записей. Сортируем их в порядке убывания.
Далее мы по этим айдишникам забираем 10 фильмов из таблицы movies, отсортировав результат по среднему баллу в порядке убывания (voites_average).

Это нужно сделать 1-м запросом.

В текущей ситуации мы получаем результат, отсортированный по количеству обсуждений, но не по среднему баллу.
 

Bitterman

Новичок
Можно, наверное, попробовать с вложенным запросом. То есть с помощью твоего запроса получить 10 id, а во внешнем запросе отсортировать их уже по среднему баллу.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Согласно Вашему запросу выборка правильная, так-как Вы предварительно уже отсортировали по полю talks.
И, если рассмативать выборку "внутри" talks 4, voites_average сортируется правильно в "убывающем" порядке.
4,18, 4,15, 1,75, 1,14

m.name,....m.voites_average, m.voites_count, talks
"Шакал";...4.08;3471;5
"Однажды";4.18;674;4
"Матрица-3";4.15;1671;4
"Люди в черном";1.75;53;4
"Санта-барбара";1.14;432;4
 

Yura123

Новичок
Автор оригинала: Mr_Max
Согласно Вашему запросу выборка правильная, так-как Вы предварительно уже отсортировали по полю talks.
И, если рассмативать выборку "внутри" talks 4, voites_average сортируется правильно в "убывающем" порядке.
4,18, 4,15, 1,75, 1,14

m.name,....m.voites_average, m.voites_count, talks
"Шакал";...4.08;3471;5
"Однажды";4.18;674;4
"Матрица-3";4.15;1671;4
"Люди в черном";1.75;53;4
"Санта-барбара";1.14;432;4
Что-то не вижу, чтобы voites_average сортировалось правильно, покажите, пожалуйста.
 

Bitterman

Новичок
Но проблема в том, что, когда я цепляю этот внутренний запрос к внешнему, то, естественно, внешний говорит, что должно быть только 1 поле во внутреннем запросе
Дык отдай ему одно поле, что тут сложного?!
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Если поменять
ORDER BY m.voites_average DESC, talks DESC

Данные будут в виде
"Однажды";4.18;674;4
"Матрица-3";4.15;1671;4
"Шакал";...4.08;3471;5
"Люди в черном";1.75;53;4
"Санта-барбара";1.14;432;4

Если строка "Шакал" будет иметь вид "Шакал";...4.15;3471;5
то будет работать 2-е правило сортировки

"Однажды";4.18;674;4
"Шакал";...4.15;3471;5
"Матрица-3";4.15;1671;4
"Люди в черном";1.75;53;4
"Санта-барбара";1.14;432;4
 

Yura123

Новичок
Автор оригинала: Bitterman
Дык отдай ему одно поле, что тут сложного?!
Было бы замечательно, если б вы подсказали, каким образом :)
Обратите внимание -- внутренний запрос сортирует по _количеству_ записей в таблице board.
Т.е., в любом случае я должен сделать SELECT COUNT(movie_id), чтобы отсортировать по количеству записей.
При этом же, мне нужно отдать внешнему запросу десять айдишников, на которые больше всего записей, потому получается 2 поля.
 

Yura123

Новичок
Автор оригинала: Bitterman
В мануал, читать про сортировки.
Давайте не будем умничать. Я не первый год работаю с mysql, не одну книгу и ман прочел.
Если не можете ничего предложить, проходите мимо.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
И, если рассматривать выборку "внутри" talks 4!!!!

"Однажды";4.18;674;4
"Матрица-3";4.15;1671;4
"Люди в черном";1.75;53;4
"Санта-барбара";1.14;432;4
 

Yura123

Новичок
Автор оригинала: Mr_Max
И, если рассматривать выборку "внутри" talks 4!!!!

"Однажды";4.18;674;4
"Матрица-3";4.15;1671;4
"Люди в черном";1.75;53;4
"Санта-барбара";1.14;432;4
Не совсем понял, что вы имеете ввиду "рассматривать выборку "внутри" talks 4" ?

-~{}~ 13.04.07 16:43:

Автор оригинала: Mr_Max
И, если рассматривать выборку "внутри" talks 4!!!!

"Однажды";4.18;674;4
"Матрица-3";4.15;1671;4
"Люди в черном";1.75;53;4
"Санта-барбара";1.14;432;4
Если я правильно вас понял, то запрос будет таков:

SELECT name, voites_average, voites_count, talks FROM (SELECT m.name, m.voites_average, m.voites_count, COUNT(b.movie_id) AS talks FROM movies m, board b WHERE m.id = b.movie_id GROUP BY m.id ORDER BY talks DESC, m.voites_average DESC LIMIT 0, 10) AS temp_table ORDER BY temp_table.voites_average DESC
 

Bitterman

Новичок
Что-то я действительно ступил, сорри, заработался. Тогда, я думаю, самым простым будет отсортировать в скрипте. С 10 записями это не составит труда. Думаю это лучше, чем городить сложные запросы.
 

Yura123

Новичок
Автор оригинала: Bitterman
Что-то я действительно ступил, сорри, заработался. Тогда, я думаю, самым простым будет отсортировать в скрипте. С 10 записями это не составит труда. Думаю это лучше, чем городить сложные запросы.
Ничего, бывает, пятница :)
Похоже, я уже решил траблу, посмотрите предыдущий пост.
 
Сверху