有条件的每个父母的平均值

时间:2016-09-20 00:15:36

标签: mysql greatest-n-per-group

我有父posts表,孩子votesposts.idvotes.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

1 个答案:

答案 0 :(得分:1)

好的,您想要选择每个帖子最近50行的行。对于此类查询,Stack Overflow有很多答案,大部分都在标记下。示例:How to SELECT the newest four items per category?

一旦你编写了那个查询,你就可以放入一个像你已经知道如何编写的子查询,以获得每个帖子的AVG(vote)

重新评论:

这就是我的意思:

SELECT T1.title, AVG(V.vote) AS avg_vote 
FROM posts T1 
JOIN (
   SELECT v1.id, v1.post_id, v1.vote
   FROM votes v1
   LEFT OUTER JOIN votes v2 ON v1.post_id = v2.post_id and v1.id < v2.id
   GROUP BY v1.id
   HAVING COUNT(*) < 10
) AS V ON T1.id = V.post_id
GROUP BY T1.id;

给出SQLFiddle中的数据输出:

+---------+----------+
| title   | avg_vote |
+---------+----------+
| Title 1 |   5.4000 |
| Title 2 |   4.2000 |
+---------+----------+

为了帮助子查询中的JOIN,您应该在列{(1}},votespost_id上有一个索引。

这是另一种无需唯一列的解决方案:

id

输出与先前的查询相同。