У меня родитель posts
стол и ребенок votes
с posts.id
10 и votes.post_id
отношение. Я хочу посчитать средний рейтинг за каждый пост, но только за последние 50 голосов. Я знаю, как сделать это для всех голосов:Среднее значение для каждого родителя с условием
SELECT T1.`title`, (
SELECT AVG(`vote`)
FROM `votes`
WHERE `votes`.`post_id` = T1.`id`
) AS `average`
FROM `posts` T1
GROUP BY T1.`id`
Я знаю, что это можно сделать с подзапроса:
SELECT T1.`title`, (
SELECT AVG(`vote`)
FROM (
SELECT `vote` FROM `votes`
WHERE `votes`.`post_id` = T1.`id`
ORDER BY `votes`.`id` DESC
LIMIT 10
) AS T2
) AS `average`
FROM `posts` T1
GROUP BY T1.`id`
Но есть ошибка: Error in query (1054): Unknown column 'T1.id' in 'where clause'
. T1
псевдоним недоступен в подзапросе. Есть идеи?
http://sqlfiddle.com/#!9/fb9341/2
Да, но мне все равно нужно передать псевдоним в подзапрос, потому что 'AVG' создает дополнительный подзапрос. – hlcs
Нет, нет. Выполняйте запрос top-50 на 'vote.post_id' без ссылки на внешний запрос. Сделайте это как подзапрос в предложении 'FROM'. Затем присоедините это к таблице 'posts'. –
Я сделал это, и это очень медленно 4.5s. – hlcs