【发布时间】:2010-12-02 16:01:28
【问题描述】:
我有许多表我正试图与联接组合,但因此,结果以多行形式返回,而我希望将它们生成为新列。
成员信息表
MemberID | FirstName | LastName
---------------------------------
1 | John | Harris
2 | Sarah | Thompson
3 | Zack | Lewis
member_dependent_information 表
MemberID | FirstName | LastName | Type
---------------------------------------
1 | Amy | Harris | 1
2 | Bryan | Thompson | 1
2 | Dewey | Thompson | 2
2 | Tom | Thompson | 2
3 | Harry | Lewis | 2
3 | Minka | Lewis | 1
MySQL 查询:
SELECT
t1.FirstName,
t1.LastName,
t1.MemberID,
IF(t2.Type = '1',CONCAT(t2.FirstName,' ',t2.LastName),'') AS Spouse_Name,
IF(t2.Type = '2',CONCAT(t2.FirstName,' ',t2.LastName),'') AS Child_Name,
FROM
member_dependent_information t2
INNER JOIN
member_information t1
USING
(MemberID)
ORDER BY
t1.LastName ASC,
t1.MemberID ASC;
理想结果
MemberID | FirstName | LastName | Spouse_Name | Child_Name1 | Child_Name2
--------------------------------------------------------------------------------
1 | John | Harris | Amy Harris | NULL | NULL
2 | Sarah | Thompson | Bryan Thompson | Dewey Thompson | Tom Thompson
3 | Zack | Lewis | Mika Lewis | Harry Lewis | NULL
实际结果
MemberID | FirstName | LastName | Spouse_Name | Child_Name
-------------------------------------------------------------------
1 | John | Harris | Amy Harris | NULL
2 | Sarah | Thompson | Bryan Thompson | NULL
2 | Sarah | Thompson | NULL | Dewey Thompson
2 | Sarah | Thompson | NULL | Tom Thompson
3 | Zack | Lewis | Mika Lewis | NULL
3 | Zack | Lewis | NULL | Harry Lewis
虽然我的查询在多行中返回“正确”数据,但它不会根据需要将结果合并为一行。
下面已经提到了关于数据透视表/交叉表的建议,但我能找到的每个参考都建议使用数学计算,或者要返回的字段数量是已知的。我不会知道这个信息,因为一个成员最多可以有 100 名家属(虽然更像是 4-8 名)
更新 #1
我觉得我离最终解决方案越来越近了。我将函数 GROUP_CONCAT 添加到我的查询中,该函数在单个列中返回所有名字,在单个列中返回所有姓氏,但仍需要将它们分成各自的列。
新功能是:
SELECT
t1.MemberID,
t1.FirstName,
t1.LastName,
GROUP_CONCAT(t2.FirstName) AS Dep_Firstnames,
GROUP_CONCAT(t2.LastName) AS Dep_LastNames
FROM
member_information t1
LEFT OUTER JOIN member_dependent_information t2
ON t1.MemberID = t2.MemberID
WHERE
t1.Status = 1
GROUP BY
t1.MemberID
【问题讨论】:
-
t1.Status = 1来自哪里? -
它与一个活成员有关,即表中的另一个字段。我上面的例子应该包含整体想法
标签: mysql