我想获取一组列出的投票计数,按投票数排序(例如)
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
我有两张桌子:
帖子 - 列 - id
,body
,is_hidden
投票 - 列 - id
,post_id
,vote_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_id
和id 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}}
答案 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)