我的查询需要啥,可能不存在或不存在? [复制]

Posted

技术标签:

【中文标题】我的查询需要啥,可能不存在或不存在? [复制]【英文标题】:What do I need in my query, perhaps NOT EXISTS or NOT IN? [duplicate]我的查询需要什么,可能不存在或不存在? [复制] 【发布时间】:2019-11-03 05:01:36 【问题描述】:

我有一张桌子叫review:

review_id   cat_id   public_or_private
1           1              0
11          2              2
12          3              1
13          4              2
14          5              2

还有一个叫category的表:

cat_id   user_id  
1        10298            
2        10299
3        10300
4        10299
5        10298

我的声明:

$sql2 = "SELECT * 
        FROM review 
            INNER JOIN category ON review.cat_id = category.cat_id 
        WHERE review.public_or_private = 2"; 

这会给我结果:

review_id   cat_id   public_or_private   cat_id   user_id              
    11          2              2           2        10299
    13          4              2           4        10299
    14          5              2           5        10298

contacts表:

user_id    contact_id
10299       10298
10299       10300
10300       10298
10300       10301

如何进一步磨练这一点? : 如果user_id 不在contacts 表的contact_id 列中,我只想要结果。

所以从用户10300 的角度来看,结果应该是:

review_id   cat_id   public_or_private   cat_id   user_id              
    11          2              2           2        10299
    13          4              2           4        10299

我认为我应该使用NOT EXISTSNOT IN,但不知道应该怎么写。

【问题讨论】:

我发现user_idcontact_id 的用法非常混乱。这些代表什么?它是什么意思,你想要的查询实际上是做什么的? 应用程序的每个用户都有一个user_id,它通过php连接到db并做一些事情。 contacts 表,在contact_id 列中,包含10300 的联系人,或任何user_id 已登录的联系人。希望能稍微清除一下... 因此,您需要一个查询,对于还没有任何联系人的任何用户,返回带有public_or_private = 2 的评论并返回撰写这些评论的用户。这仅适用于单个非接触式用户吗?还是多个? 请在发布问题之前彻底研究。答案通常已经在这里。 @KIKOSoftware 是的,正确的。这将适用于任何登录的 user_id。我正在查看下面 alx 的答案,认为他可能已经解决了我的问题。发送。 【参考方案1】:

我想这就是你想要的:

SELECT * 
        FROM review 
            INNER JOIN category ON review.cat_id = category.cat_id
            LEFT JOIN contacts ON contacts.user_id = category.user_id
        WHERE review.public_or_private = 2
        AND contacts.contact_id IS NULL

这里有一个支持该声明的示例:http://www.sqlfiddle.com/#!9/7bfb62/3

这也有效:

SELECT * 
        FROM review 
            INNER JOIN category ON review.cat_id = category.cat_id
        WHERE review.public_or_private = 2
        AND NOT EXISTS(
            SELECT *
            FROM contacts
            WHERE contacts.user_id = category.user_id
       );

这里是更新的小提琴:http://www.sqlfiddle.com/#!9/7bfb62/5

【讨论】:

很遗憾,这是一个重复的问题。 @mickmackusa 几乎所有问题在某种程度上都是重复的,你的意思是你选择关闭这个问题。 正确,几乎所有问题都是重复的。 我会说有好的和坏的重复。好的——当以不同方式提出相同的问题时,会添加不同的用例、上下文和搜索关键字。糟糕的问题就是——糟糕的问题:在询问之前太少或没有谷歌搜索。这个不好,顺便说一句。 @alx 太好了,谢谢。您的查询实际上给了我一个我不想要的 :) 但我修改了它 - 我正在使用 AND NOT EXISTS 一个 - 到 AND NOT EXISTS(SELECT * FROM contacts WHERE contacts.contact_id = category.user_id); 现在它给出了正确的结果。

以上是关于我的查询需要啥,可能不存在或不存在? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

sap号码单范围对于目标BANF不存在啥意思

从具有不同基因的受试者列表中创建一个矩阵,这些基因存在或不存在于 python

更好的 tsql 查询来确定谁是新客户(或不存在的替代品)

错误:表可能不存在或不受支持的关系类型代码:25350 上下文:查询:0 位置:mysqlclient.cpp:255 进程:padbmaster [pid=15091]

在 dplyr 中,如何通过可能存在或不存在的列连接数据框?

在 c# 中,如何测试/获取/设置可能存在或不存在的注册表项?