繁体   English   中英

MySQL查询(使用JOIN)仅检索第一行

[英]MySQL query (with JOIN) only retrieving the first row

这是我的查询

$getPosts = mysql_query ('SELECT `posts`.*, COUNT(`comments`.`comment_id`) 
                          FROM `posts` 
                          LEFT JOIN `comments` 
                          ON (`posts`.`post_id` = `comments`.`post_id`) 
                          ORDER BY `posts`.`post_id` DESC')
            or die(mysql_error());

然后循环通过它......

while ($post = mysql_fetch_row($getPosts))
{
    echo $post[1] . ' ' . $post[4] . ' comments'; // example
}

一切正常,但只适用于第一行。

现在,post_id 1有2条评论。 post_id 2在DB中没有注释。

我认为这是JOIN的工作方式,但我不明白。 我认为LEFT JOIN只匹配左侧的内容(所以post_id)但我尝试了INNER JOIN,OUTER JOIN等等。它不起作用

您的COUNT()聚合必须与GROUP BY子句一起使用。 如果没有它,MySQL将返回结果,但它们不会是您期望的结果,因为它将不确定地返回一个相关行。

SELECT
  `posts`.*, 
  `c`.`num_comments`
FROM
  `posts` 
  /* join against a subquery which retrieves the number of comments per post_id */
  LEFT JOIN (
    SELECT `post_id`, COUNT(*) AS `num_comments` 
    FROM `comments`
    GROUP BY `post_id` 
  ) AS c ON (`posts`.`post_id` = `c`.`post_id`) 
ORDER BY
  `posts`.`post_id` DESC

MySQL可能会允许您在没有子查询的情况下简化此操作,因为它不需要在GROUP BY列出posts每个列,但不建议这样做,因为它不会在任何地方都起作用。

/* MySQL only, not recommended */
SELECT
  posts.*,
  COUNT(comments.comment_id) AS num_comments
FROM 
  posts
  LEFT JOIN comments ON posts.post_id = comments.post_id
GROUP BY posts.post_id

否则,您需要列出GROUP BY posts每一列,因为它们都是SELECT 这将起作用,因为联接仅涉及comments一对多关系posts

在PHP中获取此行时,请使用别名num_comments 建议使用mysql_fetch_assoc() ,并按名称而不是数字键访问列。

while ($post = mysql_fetch_assoc($getPosts))
{
    echo $post['post_id'] . ' ' . $post['num_comments'] . ' comments';
}

从长远来看,如上面的评论所述,考虑切换到更新的API,如MySQLi或PDO,因为mysql_*()扩展在下一个主要的PHP版本中面临弃用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM