我有表posts
和posts_votes
。在posts_votes
我有id
和post_id
以及vote
。现在我希望从过去1天内有最高投票数的帖子中选择,使用此设置时间
from_unixtime(post_date) >= SUBDATE(NOW(),1)
答案 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可能会实现这一点并自动优化,但这是最佳实践。