Как сделать JOIN в MySQL без связанных строк - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть две таблицы, одна из которых является пользователями, а другая - связанными программами через отношение многие ко многим через таблицу 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 - Джонатан:

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       |
+----------+----------------------+

Я получил много объединений, но не смог. Кто-нибудь знает как это сделать? спасибо

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Вы можете присоединить 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

См. Демонстрационную версию . Результаты:

| name     | program              |
| -------- | -------------------- |
| Jonathan | Microsoft Excel      |
| Jonathan | Microsoft PowerPoint |
|          | Microsoft Word       |
0 голосов
/ 28 апреля 2020

Вам нужна просто группа в конце

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...