MYSQL获取10个帖子,每个帖子有投票数,按投票数排序,受帖子的where子句限制

时间:2009-11-19 17:22:21

标签: mysql count left-join aggregate-functions

我想获取一组列出的投票计数,按投票数排序(例如)

Post 1 - Post Body blah blah - Votes: 500
Post 2 - Post Body blah blah - Votes: 400
Post 3 - Post Body blah blah - Votes: 300
Post 4 - Post Body blah blah - Votes: 200

我有两张桌子:

帖子 - 列 - idbodyis_hidden
投票 - 列 - idpost_idvote_type_id

以下是我尝试的查询:

SELECT p.*, v.yes_count
FROM posts p
LEFT JOIN
    (SELECT post_id, vote_type_id, COUNT(1) AS yes_count
    FROM votes 
    WHERE (vote_type_id = 1) 
    GROUP BY post_id
    ORDER BY yes_count DESC
    LIMIT 0, 10) v 
ON v.post_id = p.id
WHERE (p.is_hidden = 0)
ORDER BY yes_count DESC
LIMIT 0, 10  

正确性:上述查询几乎可以正常运行。子选择包括votes posts is_hidden = 1 posts,当我离开加入yes_count时,如果隐藏的帖子在前10名(按投票排名) ,我最终可以在vote_type_id字段上找到包含NULL的记录。

演出:我有~50k的帖子和~50万票。在我的开发机器上,上面的查询在.4sec中运行。我希望等待或低于执行时间。

索引:我在Votes表上有一个索引,其中包含以下字段:post_idid select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY p ALL NULL NULL NULL NULL 45985 Using where; Using temporary; Using filesort 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 10 2 DERIVED votes ref VotingPost VotingPost 4 319881 Using where; Using index; Using temporary; Using filesort

EXPLAIN

{{1}}

1 个答案:

答案 0 :(得分:0)

尝试

SELECT p.*, count(*) yes_count
FROM posts p
LEFT OUTER JOIN votes v ON (v.post_id = p.id and v.vote_type_id = 1)
WHERE p.is_hidden = 0
GROUP BY p.id
ORDER BY yes_count DESC
LIMIT 0,10

由于这是mysql,只有p.id s分组才能工作(但这不能移植到其他dbs)