首页 > 解决方案 > SQL:选择第二个表中没有相应用户ID的行

问题描述

我在下面有 2 个表:

留言

在此处输入图像描述

在此表中,对于特定消息,如果它的类型为“Q”,则它是一个问题。否则这是来自 2 个用户的对话。

对话表

这会跟踪对话并具有 questionuserid 和 answer userid

在此处输入图像描述

现在从上表中,我想获取所有不属于该类型的消息,Q并且userid该消息的不应该是answeruserid对话表中相应问题的消息。id消息中的表是对话questionid中的表。

这是我尝试过的:

SELECT
    *
FROM
    chekmarc.messages AS a
WHERE
    userid NOT IN
    (
        SELECT
            answeruserid
        FROM
            chekmarc.conversations AS b 
       WHERE
            a.id = b.questionid 
    )
    AND
    a.type != 'Q';

但是NOT IN对应于多级引用,所以在这里不起作用。

这是我接下来尝试的:

SELECT
    m.*,
    c.*
FROM
    chekmarc.messages m
    INNER JOIN
    (
        SELECT
            *
        FROM
            chekmarc.conversations c 
        WHERE
            answeruserid IS NOT NULL
            AND
            questionid IS NOT NULL
    ) c ON
        c.questionid = m.id
        AND
        m.userid = c.answeruserid
WHERE
    m.type != 'Q'
    AND
    m.userid IS NOT NULL
    AND
    m.id IS NOT NULL;

但我得到不匹配的行和所需的结果。我怎样才能做到这一点?

谢谢。

更新 :

标签: mysqlsql

解决方案


我相信这会奏效:

SELECT
    *
FROM
    messages AS m1
    INNER JOIN conversations AS c1 ON m1.conversationid = c1.id
WHERE
    m1.type <> 'Q'
    AND
    m1.userid <> c1.answeruserid

请记住,a JOIN(匹配行)与WHERE x IN ( SELECT y FROM z )谓词不同,即使它们都可以导致相同的结果(但仅在普通查询中)。

了解JOINs 如何工作(以及何时使用它们)是了解 SQL 最难的部分之一。我希望 SQL 教程和指南能够在 s之后 JOIN引入子查询,否则人们会误解 SQL 的心理模型。


推荐阅读