2

我有以下查询:

$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 是用户 1 不喜欢和不喜欢的,4 和 5 不是任何用户喜欢和不喜欢的)。因此 $count 应该包含 4(找到 4 个结果)。

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

最终,问题是我该怎么做:

if ($count > 10) {}
4

6 回答 6

3

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

好吧,让我们分解一下。

它正在计算用户不喜欢或不喜欢的所有帖子。喜欢和不喜欢存储在出租车表中。Taxi.taxiID 匹配 post.ID。因此,如果找到任何非 null 值的用户 ID,请忽略该 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:

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
于 2012-04-19T03:55:52.373 回答
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

于 2012-04-19T01:53:05.307 回答
0

我找到了答案,这很简单:

if (count($count) > 10) {}
于 2012-04-19T03:39:52.057 回答
0
SELECT COUNT(*) FROM post
WHERE postID NOT IN                     
  ( SELECT taxiID
    FROM taxi 
    WHERE userID = '.$userID.'
      AND value = 0
  ) 
ORDER BY postID;
于 2012-04-19T01:51:27.737 回答
0
SELECT COUNT(*) FROM post
WHERE postID NOT IN                     
  ( SELECT taxiID
    FROM taxi 
    WHERE userID = '.$userID.'
      AND value = 0
  )

如果这不起作用,您能否向我们提供错误消息?

于 2012-04-19T01:52:53.737 回答
0

为什么不是这个?

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

order by请注意,如果您只是在寻找计数,则无需执行 an 。另请注意,您有一个limit,因此结果不会超过 10 条记录。不确定这是否是这个想法。

于 2012-04-19T01:53:02.623 回答