Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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
Php 从MySQL表中选择数据,其中来自另一个表的某些结果取决于条件(如果有的话)_Php_Mysql_Join_Count - Fatal编程技术网

Php 从MySQL表中选择数据,其中来自另一个表的某些结果取决于条件(如果有的话)

Php 从MySQL表中选择数据,其中来自另一个表的某些结果取决于条件(如果有的话),php,mysql,join,count,Php,Mysql,Join,Count,使用PHP代码,我希望以特定的方式订购一些MySQL结果 我有两张桌子: 第一个表,称为post,包含以下非详尽的内容: 身份证件 发布日期 出版日期 ... 第二个表,称为投票,包含以下非详尽内容: 身份证件 邮政编码 用户id 地位 如果用户为现有帖子投票,则会在投票表中创建一条记录,将帖子id作为帖子id插入,将用户id作为用户id插入。上升投票的状态为1,下降投票的状态为2 但是要记住一件重要的事情:一些帖子可能根本就不会获得任何投票,例如,在第二个表中会发现0个出现 因此,现在在我的第

使用PHP代码,我希望以特定的方式订购一些MySQL结果

我有两张桌子:

第一个表,称为post,包含以下非详尽的内容:

身份证件 发布日期 出版日期 ... 第二个表,称为投票,包含以下非详尽内容:

身份证件 邮政编码 用户id 地位 如果用户为现有帖子投票,则会在投票表中创建一条记录,将帖子id作为帖子id插入,将用户id作为用户id插入。上升投票的状态为1,下降投票的状态为2

但是要记住一件重要的事情:一些帖子可能根本就不会获得任何投票,例如,在第二个表中会发现0个出现

因此,现在在我的第一页上,我按照投票数向上和向下的顺序排列我的帖子,并且效果很好:

但在下一页,即新的迭代中,我需要继续我离开的地方,在投票方面。在此之前,我保存第一页最后一篇文章的票数,将其传递给下一篇文章,在变量$last_post_vots下

现在,我要做的就是:在新的请求中,我需要寻找投票率低于这个变量的帖子。以下是我失败的尝试:

$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');

如果你的第一句话很好,你为什么不继续呢

Aou从LIMIT 0,5的LIMIT子句开始,它给出结果集的前5条记录。如果您增加第一个参数以限制,它将显示接下来的5条记录,依此类推。不需要摆弄临时变量

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

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

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

另请参见

如果我没有弄错的话,这就是您要找的吗

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;

到底该如何选择订单。。。工作这可以归结为5的顺序,这是毫无意义的。您是否尝试进行分页,如果可以的话,可以使用LIMIT,所以第二个页面将是LIMIT5,5,所以您只需要保存新代码中的偏移量。它们不再得到维护,而是在使用。改为学习准备好的语句,并使用or。@Borik是的,但我实现了一些无休止的滚动。因此,经过几次迭代,最终,页面跳转到下一个页面。如果我没有弄错的话,使用这种技术可能最终会看到一些已经来自上一页的帖子,如果同时发布了一些新帖子,而用户仍在浏览第一个帖子。对的我想避免的是,当数据发生变化时,任何部分数据集都有可能再次看到同一行。如果您试图避免这种情况,并且您的完整数据集不是很大,那么您可以尝试加载完整数据集并使用jQuery实现分页。谢谢。但不知怎么的,我没能做到这一点。但即使如此,我也需要对低于我的变量$last_post_votesThank you的选票设置一个条件。是的,我可以很好地使用这种技术。但我实现了一些无休止的滚动。因此,经过几次迭代,最终,页面跳转到下一个页面。如果我没有弄错的话,使用这种技术可能最终会导致查看上一页的一些帖子,如果用户在浏览第一页时发布了一些新帖子。对的这是我想要避免的。
$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');
// first page
SELECT ... LIMIT 0,5

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

// 10th page
SELECT ... LIMIT 45,5
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;