【问题标题】:php SELECT with join but show data that is not joinedphp SELECT 加入但显示未加入的数据
【发布时间】:2023-04-05 10:29:01
【问题描述】:

我有 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 上发表。

我知道我可以使用 JOINS 显示文章 1 已发布的所有频道,但想要获取文章 1 未发布的所有频道,在此示例中仅为 Linkedin。

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

【问题讨论】:

  • 同时指定预期结果。

标签: php sql join


【解决方案1】:

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

SELECT c.*
       FROM tbl_channel c
       WHERE NOT EXISTS (SELECT *
                                FROM tbl_published p
                                WHERE p.articleid = 1
                                      AND p.channelid = c.channelid);

【讨论】:

    【解决方案2】:

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

    SELECT * 
    FROM tbl_channel
    WHERE tbl_channel.channelID NOT IN 
       (
           SELECT tbl_published.channelID
           FROM tbl_published 
           WHERE tbl_published.articleID = 1
       );
    

    【讨论】:

      【解决方案3】:

      如果您真的希望所有文章都使用此功能,请使用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;
      

      您也可以在where 子句中过滤一篇或多篇文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-03
        • 1970-01-01
        • 1970-01-01
        • 2023-01-11
        相关资源
        最近更新 更多