如何在一个查询中使用两个LEFT JOIN?

时间:2015-08-29 19:25:29

标签: mysql sql database database-design

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

第一个查询返回所有帖子的列表及其评论作为列表。评论存储在不同的表格中。

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;

我如何在同一查询中将一个连续的评论列表作为列,并将一些喜欢作为列。

3 个答案:

答案 0 :(得分:3)

那么,为什么你不能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;

答案 1 :(得分:3)

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

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;

只需将要从两个连接返回的一组列放入选择列表中,然后将连接放在一起。

答案 2 :(得分:2)

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