MySQL计算复杂的查询结果?

时间:2012-04-19 01:48:46

标签: 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包含这个:

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) {}

6 个答案:

答案 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) {}