我有两个表,一个是用户,另一个是通过user_programs表通过多对多关系链接的程序。
mysql> select * from users;
+----+----------+
| id | name |
+----+----------+
| 1 | Jonathan |
| 2 | Little |
| 3 | Annie |
| 4 | Bob |
+----+----------+
4 rows in set (0.00 sec)
mysql> select * from programs;
+-----+----------------------+
| id | name |
+-----+----------------------+
| 10 | Microsoft Word |
| 20 | Microsoft Excel |
| 30 | Microsoft PowerPoint |
+-----+----------------------+
3 rows in set (0.00 sec)
mysql> select * from link;
+---------+------------+
| user_id | program_id |
+---------+------------+
| 1 | 20 |
| 1 | 30 |
| 2 | 20 |
| 3 | 10 |
+---------+------------+
5 rows in set (0.00 sec)
我了解如何联接表并返回此类型的结果,仅过滤用户程序1-Jonathan:
mysql>
select users.name, programs.program from user_programs
join users on users.id = user_programs.user_id
left join programs on programs.id = user_programs.program_id
where users.id = 1;
+----------+----------------------+
| name | name |
+----------+----------------------+
| Jonathan | Microsoft Excel |
| Jonathan | Microsoft PowerPoint |
+----------+----------------------+
但是我真正需要的是不仅带来乔纳森的程序,而且带来他还没有的程序。
像下面这样:
+----------+----------------------+
| name | name |
+----------+----------------------+
| Jonathan | Microsoft Excel |
| Jonathan | Microsoft PowerPoint |
| | Microsoft Word |
+----------+----------------------+
我参加了很多,但没有。有谁知道该怎么办?谢谢
您可以通过programs
联接将left
联接到其他表:
select u.name, p.name program
from programs p
left join link l on l.program_id = p.id and l.user_id = 1
left join users u on u.id = l.user_id
请参见demo。结果:
| name | program |
| -------- | -------------------- |
| Jonathan | Microsoft Excel |
| Jonathan | Microsoft PowerPoint |
| | Microsoft Word |
您只需要在最后一组即可
SELECT
users.name, GROUP_CONCAT(programs.program)
FROM
user_programs
JOIN
users ON users.id = user_programs.user_id
LEFT JOIN
programs ON programs.id = user_programs.program_id
WHERE
users.id = 1
GROUP BY users.id ,users.name;
我有不同的看法
SELECT
u.name, GROUP_CONCAT(p.program)
FROM
users u
LEFT JOIN
user_programs u_p ON u.id = u_p.user_id
LEFT JOIN
programs p ON p.id = u_p.program_id
GROUP BY u.id ,u.name;