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

Wicked

Новичок
LDZ
Полюбой будет using temporary, using filesort.
Более подробную информацию можно получить, почитав про запрос EXPLAIN в мануале MySQL.

Bitterman
причем даже при использовании индексов... Но без них будет вообще мрак :)
 

nail

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

Только возникает вопрос: сильная ли нагрузка будет на БД при большом кол-ве строк в таблицах?
Во-первых, твой запрос неправильный, он неправильно считает рейтинг.
sum( t3 . rate ) - считает не сумму рейтингов в t3, а сумму рейтингов помноженных на количество комментариев
COUNT( t3 . id ) - считает не количество строк в t3, а количество строк помноженных на количество комментариев

Во-вторых, как я уже написал, такой запрос в онлайне нельзя выполнять, и никакие индексы тут не помогут.
 

Wicked

Новичок
LDZ
потому что join-ы сначала строят декартово призведение множеств-таблиц, и только потом применяют агрегатные функции count(), sum(), etc.

Допустим, у некоей user_photo есть 2 user_photo_comment и 3 useer_photo_rating. Тогда каждый из этих двух комментариев сцепляется с каждым рейтингом по очереди, из-за чего получается 2*3=6 записей. И ты именно по этим 6 записям пытаешься понять, сколько там комментариев, и какой там суммарный рейтинг.
 

LDZ

Новичок
Хорошо. А есть какой-то способ высчитывать правильно?
 

Wicked

Новичок
LDZ
делить первые на кол-во _уникальных_ вторых, а вторые - на кол-во _уникальных_ первых.

-~{}~ 02.08.07 14:39:

еще можно через union или подзапросы...
 

LDZ

Новичок
Итак. На данный момент имеем вот что:

SELECT t1. * , COUNT( DISTINCT t2 . id ) AS numcom , sum( t3 . rate )/COUNT( DISTINCT 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 DESC, rating DESC LIMIT 1

Что дальше?
 
Сверху