我想获得一些帖子
这是我的查询
$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.*
count(t.*)
但是我得到了mysql错误Warning: mysql_fetch_assoc(): supplied argument
我正在尝试SELECT count(t.post_title)
我得到了这个结果
Array ( [count(t.post_id)] => 10 )
但我只有2个帖子!
答案 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()并查看你的查询出错的原因。