Php 优化SQL查询

Php 优化SQL查询,php,sql,mysql,Php,Sql,Mysql,我有以下疑问: Select diary_id, (select count(*) from `comments` as c where c.d_id = d.diary_id) as diary_comments From `diaries` as d 这需要很长时间(在我的例子中接近0.119415)。 如何使它更快 我只看到一种方法:从主查询中为每一行的注释编号执行附加查询。但这就像是在循环中进行查询。比如: while ($r = mysql_fetch_

我有以下疑问:

Select diary_id, 
   (select count(*) 
    from `comments` as c 
    where c.d_id = d.diary_id) as diary_comments 
From `diaries` as d
这需要很长时间(在我的例子中接近0.119415)。 如何使它更快

我只看到一种方法:从主查询中为每一行的注释编号执行附加查询。但这就像是在循环中进行查询。比如:

while ($r = mysql_fetch_array($res))
{
   $comments = mysql_query("select count(*) from `comments` where d_id = ".$r['diary_id']);
}
我认为这是一个糟糕的策略。还有其他建议吗

SELECT d.diary_id, count(c.d_id) as diary_comments 
FROM diaries d
LEFT OUTER JOIN comments c ON (d.diary_id = c.d_id)
GROUP BY d.diary_id

我似乎被否决了,因为你实际上可以从日记表中检索所有需要的数据。我假设这是一个简化的示例,实际上需要日记表中的其他字段,并且此方法会返回没有注释的记录。如果您不需要这两件事中的任何一件,那么我将使用另一个答案。

看起来您在comments表中拥有了所需的所有数据,因此我看不出进行联接或子查询的原因

SELECT d_id AS diary_id, COUNT(*) AS diary_comments
FROM `comments`
GROUP BY d_id
当然加上一个为的解决方案,一个小组正是在这种情况下的事情


还有一个选择永远值得记住,这里有两个选择。首先计算每次读取时的值,然后计算每次写入时的值并存储结果。在第二种情况下,您需要在日记中添加一个名为“comments\u count”的字段,在插入新的注释时需要增加该字段。显然,这可能不如计算每次读取的计数准确,并且会减慢写入速度。但是,如果阅读的表现是伤害和写明显比阅读少,那么这可能是一个方便的方式来考虑这个问题。

好点。尽管他可能希望显示没有注释的日记项目。