Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中选择最热门的投票?_Mysql - Fatal编程技术网

如何在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表达式。