0

使用 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');
4

2 回答 2

0

如果你的第一个陈述很好,你为什么不继续呢?

Aou 从 LIMIT 子句开始,LIMIT 0,5它为您提供结果集的前 5 条记录。如果将第一个参数增加到 LIMIt,它将显示接下来的 5 条记录,依此类推。无需摆弄临时变量...

// first page
SELECT ... LIMIT 0,5

// seond page
SELECT ... LIMIT 5,5

// 10th page
SELECT ... LIMIT 45,5

另请参阅http://dev.mysql.com/doc/refman/5.0/en/select.html

于 2013-10-16T20:48:11.657 回答
0

如果我没记错的话,这就是你要找的吗?

SELECT p.id, IFNULL(COUNT(v.id), 0) - IFNULL(COUNT(v2.id), 0) AS `Votes`
FROM
posts p 
LEFT JOIN votes v on v.post_id = p.id AND v.status = 1
LEFT JOIN votes v2 on v2.post_id = p.id and v.status = 2
WHERE NOW() > p.released_date
ORDER BY `Votes` DESC;
于 2013-10-16T20:49:54.447 回答