Sql 从一个表中没有记录的表中获取记录 调查表: 答复表:
实现的第一个愿望:向我展示用户28发起的所有调查: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发起且用
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)