0

我正在尝试获取我拥有的帖子数量

这是我的查询

$Query="
    SELECT t.*,u.*,c.*
    FROM posts as t
    LEFT JOIN relations as r on r.post_id = t.post_id
    LEFT JOIN users as u on t.auther_id = u.auther_id
    LEFT JOIN categories as c on c.cate_id = r.cate_id
    GROUP BY t.post_id
";

    $Query=mysql_query($Query);
    $numberOfPosts=mysql_num_rows($Query);

这个查询效果很好

但我正在尝试转换它,我想让它更快

我想使用count(*)而不是t.*

因为当我使用 t.* 时,它会获取帖子和类别的完整数据

但我只想得到计数,所以我决定使用count(*)但我不知道如何将它与这样的查询一起使用

编辑

我已经用 SELECT 替换t.*,u.*,c.*了 SELECTcount(t.*)

但我得到了mysql错误Warning: mysql_fetch_assoc(): supplied argument

编辑2:

我正在尝试选择count(t.post_title)

我得到了这个结果

Array ( [count(t.post_id)] => 10 ) 

但是我只有2个帖子!

4

4 回答 4

2
$Query="
    SELECT t.*,u.*,c.*
    FROM posts as t
    LEFT JOIN relations as r on r.post_id = t.post_id
    LEFT JOIN users as u on t.auther_id = u.auther_id
    LEFT JOIN categories as c on c.cate_id = r.cate_id
    GROUP BY t.post_id
";

    $Query=mysql_query($Query);
    $numberOfPosts=mysql_num_rows($Query);

让我们退一步分析一下这个查询。

您正在从查询中使用的四个表中的三个中选择所有内容。连接创建了一些逻辑来将您选择的内容限制为正确的类别、作者等。一天结束时,您会从数据库中获取大量数据,然后在 PHP 中简单地询问它返回了多少行 ( mysql_num_rows)。相反,@Dagon 试图在评论中建议的是,你让 MySQL 简单地计算结果,然后返回。

让我们重构您的查询:

$query = "
    SELECT COUNT(t.post_id) AS qty
    FROM posts as t
        LEFT JOIN relations AS r ON r.post_id = t.post_id
        LEFT JOIN users AS u ON t.auther_id = u.auther_id
        LEFT JOIN categories AS c ON c.cate_id = r.cate_id
        GROUP BY t.post_id
";

    $result = mysql_query($query);
    $result_row = mysql_fetch_assoc($result);
    $numberOfPosts = $result_row['qty'];

(您也可以使用Barattlo 的自定义 execute_scalar 函数使其更具可读性。)

我需要查看您的表结构,以便在如何优化查询和获得所需结果方面提供更多帮助。

于 2012-10-08T19:44:31.967 回答
0

尝试这样做:

  $Query="
  SELECT count(t.*) as count_all
  FROM posts as t
  LEFT JOIN relations as r on r.post_id = t.post_id
  LEFT JOIN users as u on t.auther_id = u.auther_id
  LEFT JOIN categories as c on c.cate_id = r.cate_id
  GROUP BY t.post_id
  ";

$Query=mysql_query($Query);
$numberOfPosts=mysql_num_rows($Query);
于 2012-10-08T19:34:05.780 回答
0

你想做

SELECT count(t.id) AS count FROM ....

//do query with PDO or whatever you are using

$rows = mysql_fetch_assoc();
$num_rows = $rows['count'];
于 2012-10-08T19:34:27.870 回答
0

您可能应该简单地使用

SELECT count(*) as postingcount FROM posts

为什么?

因为你没有 WHERE 子句,所以没有限制。您的 JOINS 不会向结果集中添加更多行,最后您的 GROUP BY 会合并由于加入一行而可能发生的 post_id 的每个重复出现。结果应该只计算,所以假设你想知道的实数是表posts里面的数据集的个数,你不需要任何join,而且做count(*)真的是对表中的一个非常快的操作mysql。

记得检查 mysql_query 是否返回 false,因为那样你必须检查 mysql_error() 并查看查询出错的原因。

于 2012-10-08T19:38:49.580 回答