2017-01-13 115 views
0

这些都是假表名,但在我的实际问题中,想象一下业务规则,说明每个父代都有1或2个子代。这些孩子有0或1的数量。同一父母的两个孩子不能有相同的数字。MySQL:将另一个表中的2行合并到一个结果行中

我想要访问children的行中的字段,但希望将值放入数字前缀字段中。例如:

parenttochildrenassoc:

+-------------+-------------+ 
| parent | child | 
+-------------+-------------+ 
|  1  |  1  | 
|  1  |  2  | 
|  2  |  3  | 
|  3  |  4  | 
+-------------+-------------+ 

孩子:

+-------------+-------------+------------+ 
| child | number | name | 
+-------------+-------------+------------+ 
|  1  |  0  | Chuck | 
|  2  |  1  | Sally | 
|  3  |  0  | Carly | 
|  4  |  1  | Billy | 
+-------------+-------------+------------+ 

期望的结果:

+-------------+-------------+------------+ 
| parent | child0 | child1 | 
+-------------+-------------+------------+ 
|  1  | Chuck | Sally | 
|  2  | Carly |  NULL | 
|  3  |  NULL | Billy | 
+-------------+-------------+------------+ 

最近我可以得到低于:

SELECT A.parent, C0.name as child0, C1.name as child1 
FROM parenttochildassoc A 
    LEFT JOIN children C0 ON C0.child = A.child AND C0.number = 0 
    LEFT JOIN children C1 ON C1.child = A.child AND C1.number = 1 

产生这样的:

+-------------+-------------+------------+ 
| parent | child0 | child1 | 
+-------------+-------------+------------+ 
|  1  | Chuck |  NULL | 
|  1  |  NULL | Sally | 
|  2  | Carly |  NULL | 
|  3  |  NULL | Billy | 
+-------------+-------------+------------+ 

我如何扁平化呢?它似乎与此answer中描述的“枢轴”非常相似(其中一个建议的答案与我的尝试相同),但parenttochildrenassoc多对一的事实似乎打破了它。

+0

有每个单亲家庭子女的最大数目? – shmosel

+0

1或2个孩子 – thedarklord47

回答

1

实际上,你可以使用条件的聚集做到这一点,只有一个加盟:

SELECT a.parent, 
     MAX(CASE WHEN c.number = 0 THEN c.name END) as child0, 
     MAX(CASE WHEN c.number = 1 THEN c.name END) as child1 
FROM parenttochildassoc a LEFT JOIN 
    children c 
    ON C0.child = A.child 
GROUP BY a.parent; 

你可以很容易地扩展为任意数量的你想要孩子的。

如果你能在一个领域与所有的孩子住,然后用group_concat()

SELECT a.parent, 
     GROUP_CONCAT(c.name ORDER BY c.number) as children 
FROM parenttochildassoc a LEFT JOIN 
    children c 
    ON C0.child = A.child 
GROUP BY a.parent; 
+0

真的很好,谢谢 – thedarklord47

0

您可以在parent列添加分组崩溃类似父行:

SELECT A.parent, 
     MAX(C0.name) AS child0, 
     MAX(C1.name) AS child1 
FROM parenttochildassoc A 
LEFT JOIN children C0 
    ON C0.child = A.child AND C0.number = 0 
LEFT JOIN children C1 
    ON C1.child = A.child AND C1.number = 1 
GROUP BY A.parent 

这应该工作的原因是MAX()函数忽略NULL值。因此,当汇总parent = 1的两行时,只有非NULL值将出现在结果集中。

+0

如果我需要访问'children'中的其他字段,这项工作是否会奏效?我能不能只取最大值? – thedarklord47

+0

是的,你可以添加额外的字段,但你应该看看戈登的答案,因为它稍微直截了当。 –

相关问题