【问题标题】:How can I join two tables that should be only one in a query without using auxiliary tables? (left join using two columns would work)如何在不使用辅助表的情况下连接两个应该在查询中只有一个的表? (使用两列左连接会起作用)
【发布时间】:2013-12-27 15:02:42
【问题描述】:

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

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

现在,如果我构建了模型,SurveyAnswered 和 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

有没有办法用一个查询(不是一个有 2 个子查询)来做到这一点?问题的核心似乎是我想同时加入两列:ID_SURVEY 和 ID_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

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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    使用survey 表来“驱动”查询。即,将其设为第一个表并使用left outer joins。

    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;
    

    【讨论】:

    • 差不多了,但结果并不完全一致……我会继续努力,看看能不能到达某个地方。
    • 我的错,真正的问题增加了更多的复杂性,但我明白了,谢谢一堆......我改变了一些东西,最终“外部”在不必要的地方......对我来说缺少的链接是使用“调查”来驱动查询和加入两个我不知道你可以做到的条件的技巧。
    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多