我正试图找到一种方法让我的查询更容易阅读。
说我有一张桌子:有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"
我尝试过类似于上面所示的内容,但我无法弄清楚什么特别的东西。任何帮助将不胜感激!
答案 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 强>
<强>合作伙伴强>
答案 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 |
+-------+------------+