繁体   English   中英

MySQL计数复杂的查询结果?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM