根据计数得到帖子数(*)

时间:2012-10-08 19:23:34

标签: php

我想获得一些帖子

这是我的查询

$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.*

替换了SELECT count(t.*)

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

编辑2:

我正在尝试SELECT count(t.post_title)

我得到了这个结果

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

但我只有2个帖子!

4 个答案:

答案 0 :(得分: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中只询问返回了多少行({{ 1}})。相反,@ Dagon在评论中试图建议的是,你有MySQL只是计算结果,然后返回。

让我们重构您的查询:

mysql_num_rows

(您也可以使用Barattlo's custom execute_scalar function使其更具可读性。)

我需要看到你的表格结构对如何优化查询和获得所需结果更有帮助。

答案 1 :(得分: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);

答案 2 :(得分: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'];

答案 3 :(得分:0)

您应该只使用

SELECT count(*) as postingcount FROM posts

为什么?

因为您没有WHERE子句,所以没有限制。您的JOINS不会向结果集添加更多行,最后您的GROUP BY会合并由于重新连接到一行而可能发生的post_id的每个重复出现。结果应该只计算,所以假设您想知道的实数是表格帖子中的数据集数量,您不需要任何连接,并且执行count(*)实际上是对表中的非常快速的操作的MySQL。

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