我有父posts
表,孩子votes
有posts.id
和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
别名。有什么想法吗?
答案 0 :(得分:1)
好的,您想要选择每个帖子最近50行的行。对于此类查询,Stack Overflow有很多答案,大部分都在greatest-n-per-group或limit-per-group标记下。示例: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}},votes
)post_id
上有一个索引。
这是另一种无需唯一列的解决方案:
id
输出与先前的查询相同。