[英]MySQL count complex query results?
我有以下查询:
$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";
} ?>
$ count应该大于10,并且我的php应该回显Load More,但它回显了Nothing to load。
出租车表如下所示:
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) {}
您的问题是,查询没有返回您认为的返回结果(始终独立运行查询以查看结果集是否符合您的期望)。
是的,让我们分解一下。
它计算的是用户不喜欢或不喜欢的所有帖子。 喜好和不喜欢存储在出租车表中。 taxi.taxiID与post.ID相匹配。 因此,如果找到具有不为null的任何值的userID,请忽略该post.ID。 我正在计算那些不被忽略的post.ID
您正在尝试为该用户ID计算出租车表中没有匹配记录的所有帖子。 您想要的是JOIN
表并在post
中获取通常会被JOIN
排除的那些行。 这是通过左外部连接实现的
(已编辑 )
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:
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
根据MySQL文档,如果您想知道在没有LIMIT子句的情况下将返回多少结果:
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
SELECT COUNT(*) FROM post
WHERE postID NOT IN
( SELECT taxiID
FROM taxi
WHERE userID = '.$userID.'
AND value = 0
)
ORDER BY postID;
SELECT COUNT(*) FROM post
WHERE postID NOT IN
( SELECT taxiID
FROM taxi
WHERE userID = '.$userID.'
AND value = 0
)
如果这不起作用,您还可以向我们提供错误消息吗?
为什么不呢?
SELECT COUNT(*) FROM post
WHERE postID NOT IN (
SELECT taxiID FROM taxi
WHERE userID = '.$userID.' AND value = 0
)
LIMIT 10
请注意order by
如果您只是在寻找order by
则无需执行order by
。 另请注意,此处有一个limit
,因此结果不会超过10条记录。 不确定这是否是主意。
我找到了答案,这很简单:
if (count($count) > 10) {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.