запрос из нескольких таблиц с сотрировкой по неск. полям

LDZ

Новичок
запрос из нескольких таблиц с сотрировкой по неск. полям

Прошу помощи, т.к. свои мозги уже задымились.

есть 3 таблицы:

user_photo : таблица с данными о фотографии

id, user_id, cat_id, photo_path, date (YYYY-mm-dd)


user_photo_rateтаблица с рейтингом фотографии

id, user_id, photo_id, rate

Оценка вычисляется суммой поля rate, делённой на кол-во голосов с одним id


user_photo_comments - таблица с комментариями

id, user_id, photo_id, text, date(YYYY-mm-dd), time


Вот.

Теперь задача:

Вывести фотографию (т.е. photo_path из таблицы user_photo), которая имеет наибольшую оценку за все время и наибольшее кол-во комментариев за сегодня(важно)

(фактически повторить то, что делается на Яндекс.Фотки на главной -> ФОТО ДНЯ

Каким образом это можно сделать?

Очень нужно и важно. Может кому тоже пригодится

Надеюсь на Вашу помощь
 

nail

Новичок
"которая имеет наибольшую оценку за все время и наибольшее кол-во комментариев за сегодня"

Это почти всегда неразрешимо, то есть задача неправильно поставлена.
 

LDZ

Новичок
Я имел ввиду имеет наибольшее кол-во комментариев за сегодня наибольшую оценку вообще
 

nail

Новичок
фото1 10 комментариев, оценка 5
фото2 20 комментариев, оценка 3
фото3 15 комментариев, оценка 4

какое фото надо вывести?
 

LDZ

Новичок
Сначала идет сортировка по комментариям, затем идет сортировка по оценке.

Т.е. сначала выбираются все у кого (к примеру) 20 комментариев, а затем они сортируются по оценке

Если оценки совпадают, то сортируются по дате добавления фото. Чем более свежее фото, тем оно имеет больший приоритет
 

nail

Новичок
Лучше добавь в user_photo поля rate и comments, обновляй их при изменениях. И запрос будет простой.
А иначе у тебя база быстро умрет с ростом количества строк.
 

Bitterman

Новичок
LDZ
А в чем собственно вопрос? Ты не можешь посчитать количество комментариев за день или не знаешь как по ним сортировать? Если первое, то последнее время появлялось несколько похожих тем, смотри в поиске. Если второе, то ORDER BY.
 

LDZ

Новичок
Ну выберу я кол-во комментариев, отсортирую по ним, затем надо сортировать их по оценке (соответственно подключать таблицу рейтингов) и дате

SELECT t1. * , COUNT( t2 . id ) AS numcom , sum( t3 . rate )/COUNT( t3 . id ) AS rating FROM user_photo AS t1, user_photo_comments AS t2, user_photo_rate AS t3 WHERE t1.id=t2.photo_id AND t1.id=t3.photo_id AND t2.date='$date' GROUP BY t1.id ORDER BY numcom LIMIT 1

Сделал так. Вроде что-то выводит. Но пока в базе слишком мало данных для объективной оценки правильности работы
 

LDZ

Новичок
Bitterman

Т.е. вот так?

SELECT t1. * , COUNT( t2 . id ) AS numcom , sum( t3 . rate )/COUNT( t3 . id ) AS rating FROM user_photo AS t1, user_photo_comments AS t2, user_photo_rate AS t3 WHERE t1.id=t2.photo_id AND t1.id=t3.photo_id AND t2.date='$date' GROUP BY t1.id ORDER BY numcom, rating LIMIT 1
 

Bitterman

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

LDZ

Новичок
Не-а. И с ASC и с DESC выводит фотку, у которой меньше комментов. Хотя у обоих оценки одинаковые и комментарии у обоих сегодняшние
 

Bitterman

Новичок
Естественно. Потому что ты DESC ставишь неправильно. Порядок надо указывать для каждого столбца.
 

LDZ

Новичок
)) Блин. Спасибо. Теперь все работает как надо. ))) Я рад.

Только возникает вопрос: сильная ли нагрузка будет на БД при большом кол-ве строк в таблицах?
 
Сверху