将 JOIN 添加到 GROUP_CONCAT()

Cam*_*ter 4 mysql join group-concatenation

我有一个主要是静态目标的表格,另一个用于跟踪用户完成这些目标的情况。他们可以将完成与在另一个表格和/或文本注释中输入的一个或多个记录相关联。我想将所有这些一起格式化为一个条目以显示在表格中(即每个目标一行)。

下面是一个Completion可能看起来像的示例:

ID    userID    objectiveID    recordID    text
1     4         8              500         NULL
2     4         8              NULL        "Lorem ipsum..."
3     4         8              750         NULL
Run Code Online (Sandbox Code Playgroud)

我已经走了这么远:

SELECT objectiveID,
   GROUP_CONCAT(recordID SEPARATOR ',') AS records,
   GROUP_CONCAT(text SEPARATOR ',') AS text
FROM Completion AS c
GROUP BY objectiveID;
Run Code Online (Sandbox Code Playgroud)

返回:

objectiveID    records    text
8              "500,750"  "Lorem ipsum..."
Run Code Online (Sandbox Code Playgroud)

然而,我实际上想要显示的是被引用的代码的属性recordID......假设这是Record表:

ID    userID    codeID
500   4         1111
750   4         2222
Run Code Online (Sandbox Code Playgroud)

这是Code表:

ID    description
1111  dolor
2222  sit amet
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

objectiveID    records            text
8              "dolor, sit amet"  "Lorem ipsum..."
Run Code Online (Sandbox Code Playgroud)

合并其他值的最佳方法是什么?

Rol*_*DBA 6

你加入Completion(columns userID, recordID) 到Record(columns userID, ID)

你加入Record(列codeID)到Code(列ID

这是建议的查询

SELECT c.objectiveID,
   GROUP_CONCAT(d.description SEPARATOR ',') AS records,
   GROUP_CONCAT(c.text SEPARATOR ',') AS text
FROM Completion AS c
INNER JOIN Record AS r ON c.userID=r.userID AND c.recordID=r.ID
INNER JOIN Code   AS d ON r.codeID=d.ID
GROUP BY c.objectiveID;
Run Code Online (Sandbox Code Playgroud)

由于GROUP_CONCAT 的默认分隔符是逗号,因此您可以重写为

SELECT c.objectiveID,
   GROUP_CONCAT(d.description) AS records,
   GROUP_CONCAT(c.text) AS text
FROM Completion AS c
INNER JOIN Record AS r ON c.userID=r.userID AND c.recordID=r.ID
INNER JOIN Code   AS d ON r.codeID=d.ID
GROUP BY c.objectiveID;
Run Code Online (Sandbox Code Playgroud)