我有以下查询:
$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包含这个:
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";
} ?>
$ count应该超过10并且我的php应该回显加载更多,但它回显无法加载。
出租车桌看起来像这样:
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(找到4个结果)。
如果我的查询效率低下,我该如何调整它才能有效?
最终,问题是我该怎么做:
if ($count > 10) {}
答案 0 :(得分:3)
你的问题是,你的查询没有返回你认为它返回的内容(它总是有助于独立运行查询,看看结果集是否符合预期)。
是的,让我们打破这个。
它正在计算用户不喜欢或不喜欢的所有帖子。喜欢和不喜欢的东西都存放在出租车里。 taxi.taxiID匹配post.ID.因此,如果找到具有任何非空值的userID,则忽略该post.ID.我正在计算那些不被忽略的post.ID
您正在尝试计算不在出租车表中具有该用户ID的匹配记录的所有帖子。你想要的是JOIN
表格,并获取post
中通常被连接排除的那些行。这是通过左外连接
(的编辑强>)
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
那个HAVING
子句说的是:只有结果集中那些没有相应t.taxiID的行。
如果您运行此查询并获得预期的行集(该用户没有喜欢或不喜欢的帖子)那么您可以添加外部查询来计算返回的行数:
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的帖子,或者根本没有值,这将导致为您的示例返回4:< / p>
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
答案 1 :(得分:1)
如果您想知道在没有LIMIT子句的情况下将返回多少结果,根据MySQL文档:
SELECT语句可能包含LIMIT子句以限制该数字 服务器返回到客户端的行数。在某些情况下,它是 希望知道该语句将返回多少行 没有LIMIT,但没有再次运行语句。获得 此行计数,在SELECT中包含SQL_CALC_FOUND_ROWS选项 声明,然后调用FOUND_ROWS():
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
-> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
答案 2 :(得分:0)
SELECT COUNT(*) FROM post
WHERE postID NOT IN
( SELECT taxiID
FROM taxi
WHERE userID = '.$userID.'
AND value = 0
)
ORDER BY postID;
答案 3 :(得分:0)
SELECT COUNT(*) FROM post
WHERE postID NOT IN
( SELECT taxiID
FROM taxi
WHERE userID = '.$userID.'
AND value = 0
)
如果这不起作用,您还可以向我们提供错误消息吗?
答案 4 :(得分:0)
为什么不呢?
SELECT COUNT(*) FROM post
WHERE postID NOT IN (
SELECT taxiID FROM taxi
WHERE userID = '.$userID.' AND value = 0
)
LIMIT 10
请注意,如果您只是在寻找计数,则无需执行order by
。另请注意,您有limit
,因此结果不会超过10条记录。不确定这是不是这个想法。
答案 5 :(得分:0)
我找到了答案并且很简单:
if (count($count) > 10) {}