使用 PHP 代码,我希望以特定方式订购一些 MySQL 结果。
我有两张桌子:
第一个表,称为“post”,包含以下非详尽内容:
- ID
- 发布日期
- 发布日期
- ...
第二个表,称为“投票”,包含以下非详尽内容:
- ID
- post_id
- 用户身份
- 地位
如果用户为现有帖子投票,则会在“投票”表中创建一条记录,将帖子 ID 插入为 post_id,将用户 ID 插入为 user_id。状态为 1 表示赞成,2 表示反对。
但是要记住一件重要的事情:有些帖子可能根本不会收到任何投票,例如,第二个表中会出现 0 次!
所以,现在在我的第一页上,我按照以下方式按照他们的投票数量(upvotes-downvotes)订购我的帖子,并且效果很好:
$post_req = mysql_query('SELECT * FROM post
WHERE NOW() > released_date
ORDER BY ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) DESC, published_date DESC
LIMIT 0, 5');
但是在下一页(即新的迭代)上,我需要在投票方面继续我离开的地方。在此之前,我将第一页最后一篇文章的投票数保存到变量 $last_post_votes 下的下一篇文章中。
现在,这是我挣扎的地方:我需要在新请求中查找投票数低于此变量的帖子。如下,我的失败尝试:
$post_req_1 = mysql_query('SELECT * FROM post
WHERE NOW() > released_date
AND ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) < "'.$last_post_votes.'"
ORDER BY ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) DESC, published_date DESC
LIMIT 5');
然后我尝试了类似的方法,但也失败了:
$post_req_1 = mysql_query('SELECT post.*,
((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.poste_id = post.id AND votes.status = 2)) AS all_votes
FROM post, votes
WHERE NOW() > post.released_date
AND all_votes < "'.$last_post_votes.'"
ORDER BY all_votes DESC, post.published_date DESC
LIMIT 5');
问题显然是从 SELECT 中的另一个表中搜索结果时的条件。
任何帮助是极大的赞赏!
提前非常感谢!:-)
露易丝
编辑:
ORDER BY
通过直接在自身中使用条件,我设法使其按我的意愿工作。不确定它是否超级合适,但它似乎有效:
$post_req_1 = mysql_query('SELECT * FROM post
WHERE NOW() > released_date
ORDER BY ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) < "'.$last_post_votes_passed.'" DESC, published_date DESC
LIMIT 5');