如何在MySQL中选择最热门的投票?
我有表如何在MySQL中选择最热门的投票?,mysql,Mysql,我有表posts和posts\u投票。在post\u vote中,我有id和post\u id和vote。现在我想从过去1天投票最多的帖子中进行选择,使用此设置时间 from_unixtime(post_date) >= SUBDATE(NOW(),1) 也许是这样的: SELECT posts.*, pv.votes FROM posts JOIN ( SELECT post_id, COUNT(*) AS votes FROM post
posts
和posts\u投票
。在post\u vote
中,我有id
和post\u id
和vote
。现在我想从过去1天投票最多的帖子中进行选择,使用此设置时间
from_unixtime(post_date) >= SUBDATE(NOW(),1)
也许是这样的:
SELECT
posts.*,
pv.votes
FROM
posts JOIN
(
SELECT post_id, COUNT(*) AS votes FROM posts_votes GROUP BY post_id
) AS pv ON posts.id=pv.post_id
WHERE
posts.post_date >= UNIX_TIMESTAMP()-86400
ORDER BY
pv.votes DESC;
利用GROUPBY子句可以聚合特定列上的数据,而无需求助于子查询或派生表 此查询返回所有帖子,按票数降序排列:
SELECT p.*
FROM posts p
JOIN posts_votes pv
ON pv.post_id = p.id
WHERE FROM_UNIXTIME(p.post_date) >= SUBDATE(NOW(), 1)
GROUP BY p.id
ORDER BY COUNT(pv.post_id) DESC
如果您想将其限制在前十名,可以添加限制条款:
SELECT p.*
FROM posts p
JOIN posts_votes pv
ON pv.post_id = p.id
WHERE FROM_UNIXTIME(p.post_date) >= SUBDATE(NOW(), 1)
GROUP BY p.id
ORDER BY COUNT(pv.post_id) DESC
LIMIT 10
MySQL可能能够优化日期比较,但是,一般来说,尝试在常量(右侧)而不是列(左侧)上执行所有函数
例如,您应该更改以下内容:
WHERE FROM_UNIXTIME(p.post_date) >= SUBDATE(NOW(), 1)
为此:
WHERE p.post_date >= UNIX_TIMESTAMP(SUBDATE(NOW(), 1))
这样,MySQL就不必在每一行上都从_UNIXTIME()运行。同样,MySQL可能会实现这一点并自动优化,但这是最佳实践。
UNIX\u TIMESTAMP()-86400
不考虑夏令时。最好使用内置函数,如DATE_ADD,或moustafa使用的SUBDATE()。括号之间的所有内容都是子查询。groupbypost\u id
告诉MySQL,您希望按照他们投票的帖子对投票进行分组,这样您就可以统计每个帖子的投票。如果在MySQL命令行上运行子查询,将更容易理解它的作用。@Marcus:同意。但就他的明显目的而言,+/-1小时有时可能不是世界末日,也不是他遇到麻烦的部分。该行可以替换为任何日期\添加/子日期/etc表达式。