Mysql 在不使用辅助表的情况下,如何连接查询中应该只有一个的两个表?(使用两列进行左连接将有效)

Mysql 在不使用辅助表的情况下,如何连接查询中应该只有一个的两个表?(使用两列进行左连接将有效),mysql,sql,Mysql,Sql,我必须使用一个不完美的模型,因为两个不同的表应该只有一个。。。让我们简化模型并展示它: Table: Survey Columns: ID_SURVEY | SURVEY_TYPE | SURVEY_QUESTIONS Table: SurveySent Columns: ID_SENT | ID_USER | ID_SURVEY | TMST_SENT Table: SurveyAnswered Columns: ID_RECEIVED | ID_USER | ID_SURVEY | TM

我必须使用一个不完美的模型,因为两个不同的表应该只有一个。。。让我们简化模型并展示它:

Table: Survey
Columns: ID_SURVEY | SURVEY_TYPE | SURVEY_QUESTIONS

Table: SurveySent
Columns: ID_SENT | ID_USER | ID_SURVEY | TMST_SENT

Table: SurveyAnswered
Columns: ID_RECEIVED | ID_USER | ID_SURVEY | TMST_RECEIVED | ANSWERS

-- the first column is the primary key, columns wiht same name are foreign keys
现在,如果我构建了模型SurveyanSweed和SurveySent将是同一个表,因为只有在第一次发送调查时,回答的调查才存在,或者至少使回答的调查取决于发送的调查

然而,情况并非如此,因此我尝试通过一个查询获得结果,希望是高效的,因为我不能写任何东西

我想得到的是一个用户收到的调查数量,这个用户回答的调查数量,所有这些都是针对一个特定类型的调查。经过多次尝试后,我唯一能做到这一点的方法是连接两个子查询:

SELECT Z.ID_USER, COUNT(DISTINCT ID_SENT), COUNT(DISTINCT ID_RECEIVED) FROM
  (SELECT A1.ID_USER, A1.ID_SENT 
    FROM SurveySent A1 
    JOIN Survey B ON A1.ID_SURVEY = B.ID_SURVEY 
   WHERE B.SURVEY_TYPE = @MyType) AS Z
LEFT JOIN
   (SELECT A2.ID_USER, A2.ID_RECEIVED 
    FROM SurveyAnswered A2 
    JOIN Survey B ON A2.ID_SURVEY = B.ID_SURVEY 
   WHERE B.SURVEY_TYPE = @MyType) AS Y
ON Z.ID_USER = Y.ID_USER
GROUP BY Z.ID_USER
有没有一种方法可以通过一个查询(而不是一个有两个子查询)来实现这一点?问题的核心似乎是我想同时加入两列:ID\u SURVEY和ID\u USER,但我还没有找到一种方法在单个查询中实现这一点

例如:

SELECT A1.ID_USER, COUNT(DISTINCT ID_SENT), COUNT(DISTINCT ID_RECEIVED)
FROM SurveySent A1
LEFT JOIN SurveyAnswered A2 ON A1.ID_USER=A2.ID_USER
JOIN Survey B ON B.ID_SURVEy = A1.ID_SURVEY
WHERE B.SURVEY_TYPE = @MyType
 AND (A2.ID_SURVEY = B.ID_SURVEY OR A2 IS NULL)
GROUP BY A1.ID_USER

不工作,因为在左联接后空值丢失。。。有什么帮助吗?

使用
调查
表“驱动”查询。也就是说,将其设为第一个表,并使用
left-outer-join
s

SELECT s.ID_USER, COUNT(DISTINCT ss.ID_SENT), COUNT(DISTINCT sa.ID_RECEIVED)
FROM Survey s left outer join
     SurveySent ss
     on s.id_survey = ss.id_survey left outer join
     SurveyAnswered sa
     on s.id_survey = sa.id_survey and ss.id_user = sa.id_user
WHERE B.SURVEY_TYPE = @MyType;

差不多,但结果并不完全一致。。。我会继续努力,看看我能不能有所作为。我的错,真正的问题增加了更多的复杂性,但我明白了,比很多。。。我改变了一些事情,在一天结束的时候,“外部”在不必要的地方。。。对我来说,缺少的一个环节是使用“调查”来驱动查询,以及在两个条件下加入的技巧,我不知道你可以这样做。