MySql Group By 同一张表?

标签 mysql sql group-by

有一个“联系人”列表。有些“联系人”是 parent ,有些是 child 。有些联系人有不止一个 child 。有些 child 有不止一位 parent 。 联系人可以是 parent 和 child (孙子)。

联系人之间的关系映射在表“parents_and_children”中。

"contacts" table
+----+------+
| id | name |
+----+------+
|  1 | p1   |
|  2 | p2   |
|  3 | p3   |
|  4 | p4   |
|  5 | p5   |
|  6 | p6   |
+----+------+

"parents_and_children" table
+----+-----------+----------+
| id | parent_id | child_id |
+----+-----------+----------+
|  1 |         1 |        2 |
|  2 |         1 |        3 |
|  3 |         3 |        4 |
|  4 |         5 |        2 |
|  5 |         5 |        3 |
|  6 |         5 |        6 |
+----+-----------+----------+

at查询的结果应该是:

+-------------------+------------------+
| parent(s) name(s) | children name(s) |
+-------------------+------------------+
| p1, p5            | p2, p3           |
| p3                | p4               |
| p5                | p6               |
+-------------------+------------------+

请注意,p3 是 p1 和 p5 的子级,也是 p4 的父级。 p5 是 p2 和 p3 以及 p1 的父级,而 p6 本身就是 p2 和 p3 的父级。

我不需要完整的解决方案。请给我指明方向,我会自己到达那里。到目前为止,没有任何效果。

最佳答案

您可以使用 GROUP_CONCAT 两次,如下所示:

select pnames,
    group_concat(distinct cname order by cname separator ',') cnames
from (
    select group_concat(distinct c1.name order by c1.name separator ',') pnames,
        c2.name cname
    from parents_and_children p
    join contacts c1 on p.parent_id = c1.id
    join contacts c2 on p.child_id = c2.id
    group by c2.name
    ) t
group by pnames

关于MySql Group By 同一张表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42516917/

相关文章:

php - 语法错误,PHP 中的意外 T_CONSTANT_ENCAPSED_STRING

sql - 通过计数获得中位数

Python:如何根据不同的列获取值的总和

sql - mysql 获取 order by 发生在 group by 之前

php - 对于 SQL 查询返回的每个结果,我想给出一个不同的名称

php - 如何使用php从mysql查询直接创建多维数组?

继承同一个表的Mysql Inner Join表

php - 从其中包含该名称的列中删除

mysql - SQL - 确定是否存在具有特定电子邮件的用户的订单?

MySQL:没有像组中那样的字符串?