【问题标题】:How to use two LEFT JOINs on one query?如何在一个查询中使用两个 LEFT JOIN?
【发布时间】:2015-08-30 11:41:51
【问题描述】:

我有两个查询,但我希望结果在同一个返回表中。

第一个查询返回所有帖子的列表,其中包含它们的 cmets 作为列表。 cmets 存储在不同的表中。

SELECT E.id, E.time, E.title, E.body, E.type, C.comments
FROM elements E
LEFT JOIN(
    SELECT elementID, GROUP_CONCAT(body SEPARATOR '|-|') AS comments
    FROM comments
    GROUP BY elementID
) C on C.elementID = E.id

第二个查询返回所有帖子的列表,其中包含帖子有多少喜欢/赞成的计数作为新列。喜欢的内容存储在不同的表中。

SELECT E.id, E.googleID, E.title, L.likeCount
FROM elements E
LEFT JOIN (
    SELECT elementID, COUNT(id) AS likeCount
    FROM likes
    GROUP BY elementID
) L ON L.elementID = E.id;

如何在同一个查询中将 cmets 的串联列表作为一列,并将喜欢的数量作为一列。

【问题讨论】:

    标签: mysql sql database database-design


    【解决方案1】:

    那么,你为什么不能像你已经为其他查询所做的那样JOIN 两个查询

    SELECT E.id, E.time, E.title, E.body, E.type, C.comments, E.googleID, L.likeCount
    FROM elements E
    LEFT JOIN(
        SELECT elementID, GROUP_CONCAT(body SEPARATOR '|-|') AS comments
        FROM comments
        GROUP BY elementID
    ) C on C.elementID = E.id
    LEFT JOIN (
        SELECT elementID, COUNT(id) AS likeCount
        FROM likes
        GROUP BY elementID
    ) L ON L.elementID = E.id;
    

    【讨论】:

      【解决方案2】:

      您可以将同一级别的连接“堆叠”在一起,如下所示:

      SELECT
          E.id
      ,   E.time
      ,   E.title
      ,   E.googleID
      ,   E.body
      ,   E.type
      ,   C.comments
      ,   L.likeCount
      FROM elements E
      LEFT JOIN(
          SELECT elementID, GROUP_CONCAT(body SEPARATOR '|-|') AS comments
          FROM comments
          GROUP BY elementID
      ) C on C.elementID = E.id
      LEFT JOIN (
          SELECT elementID, COUNT(id) AS likeCount
          FROM likes
          GROUP BY elementID
      ) L ON L.elementID = E.id;
      

      只需将要从两个连接返回的一组列放入选择列表中,然后将连接彼此相邻放置。

      【讨论】:

        【解决方案3】:
        SELECT E.id, E.time, E.title, E.body, E.type,
        (SELECT GROUP_CONCAT(body SEPARATOR '|-|') AS comments
        FROM comment c where C.elementID= E.id group by C.elementID) as comments,
        (SELECT  COUNT(id)
        FROM likes L where L.elementID=E.id
        GROUP BY elementID) as likeCount
        FROM elements E
        

        【讨论】:

        • 它说第 5 行的“cmets C on E.id=C.elementID LEFT like L on E.id=L.elementID group by E.id”附近有语法错误。跨度>
        • @Connorelsea :我更新了它。请检查并告诉我。
        • 谢谢。我真的很喜欢你的回答。它不仅大大缩短了查询,而且还解决了 0 like 返回为 null 的问题,我不得不在我的服务器代码中更正这个问题。谢谢!
        • 欢迎...我很高兴它按照您的完整要求为您工作。 :)
        • 请阅读本文的任何人注意:这是不正确的,无论是在likeCount 的计算中还是在复制 cmets 中。其他两个答案是正确的。
        猜你喜欢
        • 2012-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-18
        • 2011-06-28
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多