Sql 从一个表中没有记录的表中获取记录 调查表: 答复表:

Sql 从一个表中没有记录的表中获取记录 调查表: 答复表:,sql,mysql,database,Sql,Mysql,Database,实现的第一个愿望:向我展示用户28发起的所有调查: SELECT * FROM Surveys WHERE Surveys.UserID = 28 实现第二个愿望:向我展示用户28回答的所有调查: SELECT * FROM Surveys INNER JOIN Responses ON Surveys.SurveyID = Responses.SurveyID WHERE Responses.UserID = 28 第三个愿望没有实现: 显示所有不是由用户28发起且用

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

SELECT * 
  FROM Surveys 
 WHERE Surveys.UserID = 28
实现第二个愿望:向我展示用户28回答的所有调查:

SELECT * 
  FROM Surveys 
INNER JOIN Responses ON Surveys.SurveyID = Responses.SurveyID 
 WHERE Responses.UserID = 28
第三个愿望没有实现: 显示所有不是由用户28发起且用户28尚未回答的调查。。。从Surveys.SurveyID=Responses.SurveyID WHERE Surveys.UserID 28和Responses.UserID 28[或者:WHERE NOT Surveys.UserID=28或Responses.UserID=28]上的调查内部联接响应选择*

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

我曾想过使用一个子查询,比如:SELECT*FROM Surveys WHERE Surveys.UserID 28和Surveys.SurveyID SELECT Responses.SurveyID WHERE Responses.UserID=28,但这不起作用,因为子查询可以轻松生成多行


解决办法是什么?

我认为应该这样做

SELECT * 
FROM Surveys s
WHERE s.UserID != 28 
AND s.SurveyID NOT IN (SELECT R.SurveyID FROM Responses R WHERE R.UserID = 28)
不在以下位置使用: 使用左JOIN/IS为空: 使用不存在:
在列出的选项中,NOT IN和LEFT JOIN/IS NULL是等效的,尽管我更喜欢NOT IN,因为它更可读。

有关操作比较的更多信息,请参阅:
SELECT * 
  FROM Surveys 
INNER JOIN Responses ON Surveys.SurveyID = Responses.SurveyID 
 WHERE Responses.UserID = 28
SELECT * 
FROM Surveys s
WHERE s.UserID != 28 
AND s.SurveyID NOT IN (SELECT R.SurveyID FROM Responses R WHERE R.UserID = 28)
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)
   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
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)