2017-01-13 190 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

是的,你可以添加額外的字段,但你應該看看戈登的答案,因爲它稍微直截了當。 –

相關問題