如何在MySQL中选择最高票数?

时间:2010-03-31 12:33:17

标签: mysql

我有表postsposts_votes。在posts_votes我有idpost_id以及vote。现在我希望从过去1天内有最高投票数的帖子中选择,使用此设置时间

from_unixtime(post_date) >= SUBDATE(NOW(),1)

2 个答案:

答案 0 :(得分:2)

可能是这样的:

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;

答案 1 :(得分:2)

利用GROUP BY子句,您可以聚合特定列上的数据,而无需借助子查询或派生表。

此查询返回所有帖子,按投票计数按降序排列:

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子句:

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就不必在每一行上运行FROM_UNIXTIME()。同样,MySQL可能会实现这一点并自动优化,但这是最佳实践。