mysql - 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;
但我得到不匹配的行和所需的结果。我怎样才能做到这一点?
谢谢。
更新 :
- 消息表中的一个
id
可以是questionid
对话表中的多个。当用户开始对话时,会在对话下插入一个新行并引用questionid
(已发布的带有 type = 'Q' 的消息 id) - 例如,当我(比如用户 A)发布一个问题说“帮助我”时,多个用户现在可以就这个问题开始对话。现在 'help me' 存储在 type='Q' 的消息中,以表明这是一个问题。当用户说用户 B 开始与我就问题“帮助我”进行对话时,会在显示用户 A
userid
(asquestionuserid
) 和用户 B (asansweruserid
) 的对话下插入一个新行。从现在开始,任何消息都将存储在messages
表下(用户 A 和 B)。因此,如果我们要为一条消息获取与用户 B 相关的所有 convos,我们可以在会话下检查userid
消息表中是否不是questionuserid
会话中表 - 表没有关系约束
解决方案
我相信这会奏效:
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 )
谓词不同,即使它们都可以导致相同的结果(但仅在普通查询中)。
了解JOIN
s 如何工作(以及何时使用它们)是了解 SQL 最难的部分之一。我希望 SQL 教程和指南能够在 s之后 JOIN
引入子查询,否则人们会误解 SQL 的心理模型。
推荐阅读
- google-app-maker - 应用程序制造商 onClick 或 onValidate
- reactjs - 如何解决具有相同名称的道具和模块导入之间的 eslint 冲突?
- excel - Excel VBA Web Scrape 列间距问题。总线不在正确的位置
- java - 如何在没有 currentUser 的情况下检索所有 Uid?
- javascript - 无法向我的 /signup 路由提交发布请求
- python - Python - 字母、数字和组合
- jenkins - Jenkins Pipeline - 如果我不能使用 Java Path 类,如何与文件路径进行比较?
- python - QLineEdit 小部件背景颜色不会随 setStyleSheet 改变
- javascript - PixiJS 视差滚动背景和静态精灵
- c++ - 更改派生类型中的对齐方式