从一个表中获取记录,而另一个表中没有记录

Ala*_* M. 2 mysql sql database

SURVEYS 表:

SurveyID
UserID
Question
Choice1
Choice2
Choice3
Run Code Online (Sandbox Code Playgroud)

RESPONSES 表:

UserID
SurveyID
Answer
Run Code Online (Sandbox Code Playgroud)

第一个愿望(已实现):向我展示用户28发起的所有调查:

SELECT * 
  FROM Surveys 
 WHERE Surveys.UserID = 28
Run Code Online (Sandbox Code Playgroud)

第二个愿望(已实现):向我显示用户28已回答的所有调查:

SELECT * 
  FROM Surveys 
INNER JOIN Responses ON Surveys.SurveyID = Responses.SurveyID 
 WHERE Responses.UserID = 28
Run Code Online (Sandbox Code Playgroud)

第三个愿望(未实现):

向我显示所有未由用户28启动的调查以及哪些用户28尚未回答... SELECT*FROM Surveys INNER JOIN响应On Surveys.SurveyID = Responses.SurveyID WHERE Surveys.UserID <> 28 AND Responses.UserID <> 28 [或者:在哪里没有Surveys.UserID = 28 OR Responses.UserID = 28]

第三个查询消除了用户28的记录,但是将出现相同调查的其他实例.例如,假设用户29回答了调查问卷.将返回一行,因为WHERE不会禁止用户29的记录.

我想过使用子查询 - 类似于:SELECT*FROM Surveys WHERE Surveys.UserID <> 28 AND Surveys.SurveyID <>(SELECT Responses.SurveyID WHERE Responses.UserID = 28) - 但这不起作用,因为子查询可以轻松生成多行.

解决方案是什么?

OMG*_*ies 6

使用NOT IN:

SELECT s.*
  FROM SURVEYS s
 WHERE s.userid != 28
   AND s.surveyid NOT IN (SELECT r.survey_id
                            FROM RESPONSES r
                           WHERE r.userid = 28)
Run Code Online (Sandbox Code Playgroud)

使用LEFT JOIN/IS NULL:

   SELECT s.*
     FROM SURVEYS s
LEFT JOIN RESPONSES r ON r.survey_id = s.surveyid
                     AND r.user_id = 28
    WHERE s.userid != 28
      AND r.userid IS NULL
Run Code Online (Sandbox Code Playgroud)

使用NOT EXISTS:

SELECT s.*
  FROM SURVEYS s
 WHERE s.userid != 28
   AND NOT EXISTS (SELECT NULL
                     FROM RESPONSES r
                    WHERE r.userid = 28
                      AND r.survey_id = s.surveyid)
Run Code Online (Sandbox Code Playgroud)

列出的选项中,NOT IN并且LEFT JOIN/IS NULL虽然我喜欢的是等效的NOT IN,因为它更具有可读性.