如何在没有链接行的MySQL中进行JOIN

问题描述 投票:1回答:2

我有两个表,一个是用户,另一个是通过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       |
+----------+----------------------+

我参加了很多,但没有。有谁知道该怎么办?谢谢

mysql join
2个回答
1
投票

您可以通过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       |

0
投票

您只需要在最后一组即可

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;   

示例https://www.db-fiddle.com/f/bVvbUy1rirBp5tD9Fq9J8X/1

© www.soinside.com 2019 - 2024. All rights reserved.