代码之家  ›  专栏  ›  技术社区  ›  John M.

MySQL多个左连接

  •  52
  • John M.  · 技术社区  · 16 年前

    基本上,我有三张桌子。一个持有新闻,一个持有评论,一个持有用户。我的目标是创建一个页面,显示所有(稍后将分页)新闻帖子标题、正文、作者和日期。当我使用第二个查询来获取用户名时,这很好,但后来我决定使用联接。

    那有什么问题?嗯,我需要两个接头。一个是获取作者的用户名,另一个是获取评论数。当我只需输入作者的用户名时,一切都会正常工作。将显示新闻表中的所有行(共2行)。然而,当我为评论行添加第二个左连接时,我最终只从新闻中收到一行(记住,有2行),而COUNT(comments.id)给了我2行(它应该显示1,因为我对每个帖子都有评论)

    我做错了什么?为什么它只显示一条新闻,说它有两条评论,而有两条新闻,每条都有一条评论?

    SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id)
    FROM news
    LEFT JOIN users
    ON news.user_id = users.id
    LEFT JOIN comments
    ON comments.news_id = news.id
    

    还有一件事,我的左连接到评论是获取所有帖子的正确方法,不管它们是否有评论,对吗?或者这是一个正确的加入?哦,最后一件事。。。如果我将comments.news\u id=news.id切换到news.id=comments.news\u id,则得到0个结果。

    3 回复  |  直到 16 年前
        1
  •  116
  •   Mark Byers    16 年前

    您缺少GROUP BY子句:

    SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id)
    FROM news
    LEFT JOIN users
    ON news.user_id = users.id
    LEFT JOIN comments
    ON comments.news_id = news.id
    GROUP BY news.id
    

    左连接正确。如果使用了内部连接或右连接,则不会得到没有评论的新闻项。

        2
  •  7
  •   rizon    13 年前

    要显示每个新闻文章标题的所有详细信息,即主键“news.id”,您需要对“news.id”使用GROUPBY子句

    SELECT news.id, users.username, news.title, news.date,
           news.body, COUNT(comments.id)
    FROM news
    LEFT JOIN users
    ON news.user_id = users.id
    LEFT JOIN comments
    ON comments.news_id = news.id
    GROUP BY news.id
    
    推荐文章