MySQL:将来自另一个 table 的 2 行合并为一个结果行
MySQL: combine 2 rows from another table into a single result row
这些是假的 table 名称,但在我的实际问题中,假设一条业务规则规定每个 parent 有 1 个或 2 个 children。这些 children 的数字不是 0 就是 1。相同 parent 的两个 children 不能有相同的数字。
我想访问 children
行中的字段,但希望将这些值放入数字前缀字段中。示例:
parent到children关联:
+-------------+-------------+
| parent | child |
+-------------+-------------+
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
+-------------+-------------+
children:
+-------------+-------------+------------+
| 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 中描述的 "pivot" 非常相似(建议的答案之一与我的尝试相同)但 parenttochildrenassoc
是多对一的事实似乎打破了它.
您可以在 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
值。
您实际上可以通过条件聚合和一个连接来做到这一点:
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;
您可以轻松地将其扩展到您想要的任意数量的 children。
如果您可以忍受一个字段中的所有 children,则使用 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;
这些是假的 table 名称,但在我的实际问题中,假设一条业务规则规定每个 parent 有 1 个或 2 个 children。这些 children 的数字不是 0 就是 1。相同 parent 的两个 children 不能有相同的数字。
我想访问 children
行中的字段,但希望将这些值放入数字前缀字段中。示例:
parent到children关联:
+-------------+-------------+
| parent | child |
+-------------+-------------+
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
+-------------+-------------+
children:
+-------------+-------------+------------+
| 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 中描述的 "pivot" 非常相似(建议的答案之一与我的尝试相同)但 parenttochildrenassoc
是多对一的事实似乎打破了它.
您可以在 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
值。
您实际上可以通过条件聚合和一个连接来做到这一点:
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;
您可以轻松地将其扩展到您想要的任意数量的 children。
如果您可以忍受一个字段中的所有 children,则使用 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;