MYSQL:将id列表转换为子查询中的值

时间:2014-01-04 03:09:52

标签: mysql subquery string-interpolation

我正试图找到一种方法让我的查询更容易阅读。

说我有一张桌子:有ID,名字和合作伙伴。合作伙伴是一份ID列表。

 - 0, john, null
 - 1, mike, "0,2"
 - 2, sarah, "0,1"

有没有办法让子查询显示名称而不是伙伴ID? 从用户中选择u.id,u.name,(从用户i中选择i.name,其中i.id在u.parners中);

所以我可以获得如下结果:

 - 0, john, null
 - 1, mike, "john,sarah"
 - 2, sarah, "john, mike"

我尝试过类似于上面所示的内容,但我无法弄清楚什么特别的东西。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

Normalization是最好的方法。否则,请参阅FIND_IN_SET()

SELECT  a.ID,
        a.Name,
        GROUP_CONCAT(b.Name) Partners
FROM    tableName a
        LEFT JOIN tableName b
            ON FIND_IN_SET(b.id, a.partners)
GROUP   BY a.ID, a.Name

建议架构:

<强>的UserList

  • ID(PK)
  • 名称
  • 其他专栏

<强>合作伙伴

  • UserID(FK to UserList.ID)
  • PartnerID(FK到UserList.ID)

答案 1 :(得分:0)

最好遵循Normalization规则,因为这是一对多关系。

我在这里创建了两个表

1.users

create table users(
id int not null auto_increment,
name varchar(40) not null,
primary key(id)
);

insert into users( name)  values ('John'),('Mike'),('Sarah');

+----+-------+
| id | name  |
+----+-------+
|  1 | John  |
|  2 | Mike  |
|  3 | Sarah |
+----+-------+

2.partners

create table users(
id int not null auto_increment,
name varchar(40) not null,
primary key(id)
);

insert into partners values (2,1),(2,3),(3,1),(3,2);

+---------+------------+
| user_id | partner_id |
+---------+------------+
|       2 |          1 |
|       3 |          1 |
|       3 |          2 |
|       2 |          3 |
+---------+------------+

您可以使用以下查询选择用户及其合作伙伴

select u.name Users, group_concat(u1.name) Partners from users u 
left join partners p on u.id = p.user_id
left join users u1 on p.partner_id = u1.id
group by Users;

输出:

+-------+------------+
| Users | Partners   |
+-------+------------+
| John  | NULL       |
| Mike  | John,Sarah |
| Sarah | John,Mike  |
+-------+------------+