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;