首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php SELECT with join但显示未连接的数据

php SELECT with join但显示未连接的数据
EN

Stack Overflow用户
提问于 2020-04-02 17:43:02
回答 3查看 43关注 0票数 0

我有3个表格: tbl_article,tbl_channel,tbl_published显示在下面。

tbl_article

代码语言:javascript
复制
articleID  title
1          lorum
2          ipsum       

tbl_channel

代码语言:javascript
复制
channelID   channel
1           facebook
2           twitter
3           linkedin

tbl_published

代码语言:javascript
复制
publishedID     channelID   articleID
1               1           1
2               2           1

tbL_articles包含所有文章,tbl_channels所有可以发布文章的渠道,tbl_published显示当前文章发布的所有渠道。

因此,在我上面的3个表格中,文章1“lorum”,是在Facebook和Twitter上发布的。但第一篇“lorum”并没有发布在Linkedin上。

我知道我可以使用JOINS显示文章1发布在其上的所有渠道,但希望获得文章1未在其上发布的所有渠道,在本例中仅为Linkedin。

我一直在寻找答案,但我不知道如何表达这个问题,因此我找不到答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-02 18:06:46

您可以检查您的频道是否不在已发布的表中

代码语言:javascript
复制
SELECT * 
FROM tbl_channel
WHERE tbl_channel.channelID NOT IN 
   (
       SELECT tbl_published.channelID
       FROM tbl_published 
       WHERE tbl_published.articleID = 1
   );
票数 1
EN

Stack Overflow用户

发布于 2020-04-02 17:50:45

您可以使用NOT EXISTS和一个相关子查询来获取tbl_published中ID为1的频道和文章的所有条目。

代码语言:javascript
复制
SELECT c.*
       FROM tbl_channel c
       WHERE NOT EXISTS (SELECT *
                                FROM tbl_published p
                                WHERE p.articleid = 1
                                      AND p.channelid = c.channelid);
票数 2
EN

Stack Overflow用户

发布于 2020-04-02 19:05:56

如果您真的想在所有文章中使用此功能,那么可以使用cross join来生成所有组合,并过滤掉存在的组合:

代码语言:javascript
复制
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;

您还可以在where子句中筛选出一个或多个项目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60988609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档