Php MySQL计数复杂的查询结果?

Php MySQL计数复杂的查询结果?,php,mysql,count,Php,Mysql,Count,我有以下疑问: $count = (SELECT COUNT(*) FROM post GROUP BY ID HAVING ID NOT IN (SELECT taxiID FROM taxi WHERE userID = '.$userID.' AND value IS NOT NULL) ORDER BY postID), OBJECT); 计数包含以下内容: count = Array ( [0] => stdClass Object ( [COUNT(*)] => 1 )

我有以下疑问:

$count = (SELECT COUNT(*) FROM post GROUP BY ID
HAVING ID NOT IN (SELECT taxiID FROM taxi WHERE userID = '.$userID.' AND value IS NOT NULL)
ORDER BY postID), OBJECT);
计数包含以下内容:

count = Array ( [0] => stdClass Object ( [COUNT(*)] => 1 ) [1] => stdClass Object ( [COUNT(*)] => 1 ) [2] => stdClass Object ( [COUNT(*)] => 1 ) [3] => stdClass Object ( [COUNT(*)] => 1 ) [4] => stdClass Object ( [COUNT(*)] => 1 ) [5] => stdClass Object ( [COUNT(*)] => 1 ) [6] => stdClass Object ( [COUNT(*)] => 1 ) [7] => stdClass Object ( [COUNT(*)] => 1 ) [8] => stdClass Object ( [COUNT(*)] => 1 ) [9] => stdClass Object ( [COUNT(*)] => 1 ) [10] => stdClass Object ( [COUNT(*)] => 1 ) [11] => stdClass Object ( [COUNT(*)] => 1 ) [12] => stdClass Object ( [COUNT(*)] => 1 ) [13] => stdClass Object ( [COUNT(*)] => 1 ) [14] => stdClass Object ( [COUNT(*)] => 1 ) [15] => stdClass Object ( [COUNT(*)] => 1 ) [16] => stdClass Object ( [COUNT(*)] => 1 ) [17] => stdClass Object ( [COUNT(*)] => 1 ) [18] => stdClass Object ( [COUNT(*)] => 1 ) [19] => stdClass Object ( [COUNT(*)] => 1 )
我需要数一数上面提到的结果的数量。问题是,我不知道如何使用结果

我有此代码,但现在无法使用:

<?php if($count[0]->{'COUNT(*)'} > 10){ ?
    echo "Load More";
}else { 
    echo "Nothing to load";
} ?>
post表如下所示:

ID    taxiID    userID    value
1     1         1         1
2     1         6         1
3     1         4         0
4     2         1         0
5     2         6         1
6     2         4         0
7     3         6         1
8     3         4         0
ID    postID    randomNum
1     1         564
2     2         789
3     3         234
4     4         845
5     5         089
假设$userID为1,则查询返回postID 1,3,4,5 1用户喜欢,3用户不喜欢和不喜欢,4和5用户不喜欢和不喜欢。因此$count应该包含4个结果

如果我的查询效率低下,我如何调整它以提高效率

归根结底,问题是我如何做这样的事情:

if ($count > 10) {}
如果这不起作用,您能否向我们提供错误消息

如果这不起作用,您还可以向我们提供错误消息吗?

为什么不这样做

SELECT COUNT(*) FROM post
WHERE postID NOT IN (
  SELECT taxiID FROM taxi 
  WHERE userID = '.$userID.' AND value = 0
)
LIMIT 10
注意:如果您只查找计数,则无需执行订单。还请注意,您有一个限制,因此结果不会超过10条记录。不确定这是不是个主意。

为什么不是这个

SELECT COUNT(*) FROM post
WHERE postID NOT IN (
  SELECT taxiID FROM taxi 
  WHERE userID = '.$userID.' AND value = 0
)
LIMIT 10

注意:如果您只查找计数,则无需执行订单。还请注意,您有一个限制,因此结果不会超过10条记录。不确定这是否是一个想法。

根据MySQL文档,如果您想知道在没有LIMIT子句的情况下会返回多少个结果:

SELECT语句可以包含限制子句来限制数字 服务器返回到客户端的行数。在某些情况下,情况的确如此 希望知道语句将返回多少行 没有限制,但不再次运行语句。取得 此行计数,包括选择中的SQL\u CALC\u FOUND\u ROWS选项 语句,然后在其后调用找到的\u行:


如果您想知道在没有LIMIT子句的情况下会返回多少个结果,根据MySQL文档:

SELECT语句可以包含限制子句来限制数字 服务器返回到客户端的行数。在某些情况下,情况的确如此 希望知道语句将返回多少行 没有限制,但不再次运行语句。取得 此行计数,包括选择中的SQL\u CALC\u FOUND\u ROWS选项 语句,然后在其后调用找到的\u行:


我找到了答案,答案非常简单:

if (count($count) > 10) {}

我找到了答案,答案非常简单:

if (count($count) > 10) {}

您的问题是,您的查询没有返回您认为它返回的内容。独立运行查询以查看结果集是否符合您的预期总是有帮助的

好的,让我们来分析一下

它统计用户不喜欢或不喜欢的所有帖子。喜欢和不喜欢的东西都储存在出租车的桌子上。taxi.taxid与post.ID匹配。因此,如果找到任何值不为null的userID,请忽略该post.ID。我正在计算那些未被忽略的post.ID

您正在尝试为该用户ID计算所有在taxi表中没有匹配记录的帖子。这里需要的是联接表,并在post中获取通常被联接排除的行。这是通过左外连接实现的

编辑

HAVING子句的意思是:只有结果集中没有相应t.taxid的行

如果运行此查询并获得该用户不喜欢或不喜欢的预期行集,则可以添加外部查询以计算返回的行数:

SELECT COUNT(*) as count FROM (
    SELECT p.ID, t.taxiID
    FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
    HAVING t.taxiID IS NULL
) a
这应该返回一个名为count的标量。在这种情况下,您可以说:

if ($count[0]->count > 10) { blah blah blah }
第二次编辑此内部查询将获得那些在taxi表中值为1或根本没有值的帖子,这将导致返回4作为示例:

SELECT p.ID, t.taxiID, t.value
FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
HAVING t.taxiID IS NULL OR t.value = 1

您的问题是,您的查询没有返回您认为它返回的内容。独立运行查询以查看结果集是否符合您的预期总是有帮助的

好的,让我们来分析一下

它统计用户不喜欢或不喜欢的所有帖子。喜欢和不喜欢的东西都储存在出租车的桌子上。taxi.taxid与post.ID匹配。因此,如果找到任何值不为null的userID,请忽略该post.ID。我正在计算那些未被忽略的post.ID

您正在尝试为该用户ID计算所有在taxi表中没有匹配记录的帖子。这里需要的是联接表,并在post中获取通常被联接排除的行。这是通过左外连接实现的

编辑

HAVING子句的意思是:只有结果集中没有相应t.taxid的行

如果运行此查询并获得该用户不喜欢或不喜欢的预期行集,则可以添加外部查询以计算返回的行数:

SELECT COUNT(*) as count FROM (
    SELECT p.ID, t.taxiID
    FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
    HAVING t.taxiID IS NULL
) a
这应该返回一个名为count的标量。在这种情况下,您可以说:

if ($count[0]->count > 10) { blah blah blah }
第二次编辑此内部查询将获得那些值为1的帖子 在taxi表中,或根本没有值,这将导致为您的示例返回4:

SELECT p.ID, t.taxiID, t.value
FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
HAVING t.taxiID IS NULL OR t.value = 1



选择COUNT*应与查询一起使用。您收到的错误消息是什么?mysql_num_行如何?正如SuperNoob所建议的,我发现返回num_行比使用mysql CountCountCount更容易*可能比使用mysql_num_行更有效,因为必须从数据库返回结果集,mysql_num_行才能工作。COUNT不会工作。我得到一个数组,每个数组都有一个增量键。[1] =>1[2]=>1,依此类推。选择COUNT*应可用于查询。您收到的错误消息是什么?mysql_num_行如何?正如SuperNoob所建议的,我发现返回num_行比使用mysql CountCountCount更容易*可能比使用mysql_num_行更有效,因为必须从数据库返回结果集,mysql_num_行才能工作。COUNT不会工作。我得到一个数组,每个数组都有一个增量键。[1] =>1[2]=>1等等。如果忘记取消限制,您是对的。然而,伯爵不工作。@Jonathan是的,伯爵工作得很好。你把你的PHP代码搞砸了,你还没有提供。如果你忘了删除限制,你是对的。然而,伯爵不工作。@Jonathan是的,伯爵工作得很好。你把你没有提供的PHP代码搞砸了,我得到了一个数组。我需要一个数值。您应该能够直接从返回的数组中使用计数的整数值初始化变量。因此count*工作正常,您有一个新问题。您应该删除声明COUNT*不工作的部分。请注意。我想更好的问题是,如何检查$count是否大于10?@kjones:+1这是正确的。也许您可以添加一个别名,例如:选择COUNT*AS cnt FROM。。。因此OP更容易在PHP代码中检索cnt。我需要一个数值。您应该能够直接从返回的数组中使用计数的整数值初始化变量。因此count*工作正常,您有一个新问题。您应该删除声明COUNT*不工作的部分。请注意。我想更好的问题是,如何检查$count是否大于10?@kjones:+1这是正确的。也许您可以添加一个别名,例如:选择COUNT*AS cnt FROM。。。因此OP更容易在PHP代码中检索cnt。您也可以将其作为内部查询运行,使用COUNT*作为COUNT替换*,但我不记得这是如何与HAVING子句交互的。这不起作用。没有发现任何结果。见更新的问题和出租车和驿站的布局。假设$user为1,查询应找到postID 1,3,4,5,因此计数应为4。您的解决方案导致计数为0。我已修复并编辑了SQL,方法是将数据加载到测试数据库并运行它。主要的区别是,userID的测试已经移动到左连接的ON子句,value为NULL的测试已经被删除。我建议对该列使用notnull约束。你会发现$user=1的正确答案实际上是3,因为他们为帖子1和2创建了值。是的,但我正在查找所有具有值1的帖子和所有没有任何值的帖子。您的查询仅查找所有空值。这意味着我在某个地方缺少一个值=1,对吗?是的,你是对的。注意,在你的描述中,这并没有传达得那么好。我已经更新了答案,以便将其输入。您也可以将其作为内部查询运行,使用COUNT*as COUNT替换*,但我不记得这是如何与HAVING子句交互的。这不起作用。没有发现任何结果。见更新的问题和出租车和驿站的布局。假设$user为1,查询应找到postID 1,3,4,5,因此计数应为4。您的解决方案导致计数为0。我已修复并编辑了SQL,方法是将数据加载到测试数据库并运行它。主要的区别是,userID的测试已经移动到左连接的ON子句,value为NULL的测试已经被删除。我建议对该列使用notnull约束。你会发现$user=1的正确答案实际上是3,因为他们为帖子1和2创建了值。是的,但我正在查找所有具有值1的帖子和所有没有任何值的帖子。您的查询仅查找所有空值。这意味着我在某个地方缺少一个值=1,对吗?是的,你是对的。注意,在你的描述中,这并没有传达得那么好。我已经更新了答案让它进入。这确实是一种非常低效的方式,是的。仅仅因为它有效并不意味着它是正确的。我同意它是正确的,但如果我的问题没有解决方案,我就别无选择。这确实是一种非常低效的方法,是的。仅仅因为它有效并不意味着它是正确的。我同意它是正确的,但如果我的问题没有解决方案,我就别无选择。