php ВЫБРАТЬ с объединением, но показать данные, которые не объединены - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть 3 таблицы: tbl_article, tbl_channel, tbl_published, показанные внизу.

tbl_article

articleID  title
1          lorum
2          ipsum       

tbl_channel

channelID   channel
1           facebook
2           twitter
3           linkedin

tbl_published

publishedID     channelID   articleID
1               1           1
2               2           1

tbL_articles содержит все статьи, tbl_channels - все каналы, на которых статья может быть опубликована, а tbl_published - все каналы, на которых статья в настоящее время публикуется.

Итак, в моих 3 таблицах над статьей 1 «lorum», опубликовано в Facebook и Twitter. Но статья 1 «lorum» НЕ публикуется на Linkedin.

Я знаю, что могу показать все каналы, на которых статья 1 опубликована на JOINS, но хочу получить ВСЕ каналы, на которых статья 1 НЕ публикуется, в этом Например, это только Linkedin.

Я искал ответ, но не знаю, как правильно сформулировать этот вопрос, и поэтому не могу найти ответ.

Ответы [ 3 ]

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

Вы можете использовать NOT EXISTS и коррелированный подзапрос, который получает все записи в tbl_published для канала и статьи с идентификатором 1.

SELECT c.*
       FROM tbl_channel c
       WHERE NOT EXISTS (SELECT *
                                FROM tbl_published p
                                WHERE p.articleid = 1
                                      AND p.channelid = c.channelid);
1 голос
/ 02 апреля 2020

Вы можете проверить, не находится ли ваш канал в опубликованной таблице

SELECT * 
FROM tbl_channel
WHERE tbl_channel.channelID NOT IN 
   (
       SELECT tbl_published.channelID
       FROM tbl_published 
       WHERE tbl_published.articleID = 1
   );
0 голосов
/ 02 апреля 2020

Если вы действительно хотите это для всех статей, используйте cross join, чтобы сгенерировать все комбинации и отфильтровать существующие:

select a.articleid, c.*
from tbl_article a cross join
     tbl_channel c left join
     tlb_published p
     on p.channelid = c.channelid and p.articleid = a.articleid
where p.channelid is null;

Вы можете отфильтровать одну или несколько статей в * Пункт 1005 *.

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