0

我的查询结果有问题。它没有使用“QuestionContent”字段显示正确的行。

例如在数据库表中,如果它声明(不包括所有字段):

QuestionContent     Option Type    QuestionMarks     Answer   ....// other fields

What is 2+2         A-D            1                  D
What is 3+3         A-D            1                  B
What is 4+4         A-E            2                  C

那么为什么当我创建我的查询时结果显示是这样的:

QuestionContent     Option Type    QuestionMarks     Answer   ....// other fields

What is 2+2         A-D            1                  D
What is 3+3         A-D            1                  D
What is 4+4         A-D            1                  D

以下是我正在使用的查询,如何解决才能显示正确的结果?

SELECT q.QuestionContent, o.OptionType, q.NoofAnswers, a.Answer, r.ReplyType,
       q.QuestionMarks
FROM Answer a                
INNER JOIN Question q ON a.QuestionId = q.QuestionId
      JOIN Reply r ON q.ReplyId = r.ReplyId
      JOIN Question qu ON r.ReplyId = qu.ReplyId
      JOIN Option_Table o ON qu.OptionId = o.OptionId
GROUP BY q.QuestionContent

更新:下面是 4 个表的架构:

问题表:

SessionId (PK)  Varchar(3)
QuestionId(PK)  INT
QuestionContent Varchar(250)
NoofAnswers     INT
QuestionMarks   INT
ReplyId(FK)     Varchar(2)
OptionId(FK)    Varchar(2)

答案表

  SessionId (PK)  Varchar(3)
    QuestionId(PK)  INT
    Answer          Varchar(10)

Option_Table 表

  OptionId(PK)    Varchar(2)
  OptionType        Varchar(10)

回复表

  ReplyId(PK)    Varchar(2)
  ReplyType        Varchar(10)

在查询中,我想显示这些字段:

QuestionContent 
OptionType
NoofAnswers
Answer
ReplyType 
QuestionMarks 

希望这是足够的信息,如果没有,请给我评论:)

4

3 回答 3

1

问题:答案总是1:1的比例,多选。您没有理由不能将答案列放在问题表中。正如您刚才提到的,您可以使用“选项类型”作为外键并将其链接到您的各种潜在问题类型集。

编辑:我现在重新设计了每个问题的多个答案。

所以这样的设计:

QuestionContent     QuestionID(PK)    QuestionMarks     AnswerID(PK)   ....// other fields

What is 2+2         1                    1                  1
What is 3+3         1                    1                  2
What is 4+4         2                    2                  3

和“选项表”

QuestionID(FK)     Option Type

1         A-D           
2         A-E            
3         A-C    

现在是一个答案表

AnswerID(Fk) Answer

1         A           
1         B
2         A            
3         C
3         A

现在,这为您提供了任意数量的答案类型,并允许每个问题有多个答案。

于 2012-05-25T12:14:02.377 回答
1

假设 Question 表的主键是 SessionID + QuestionID,Answer 表的主键也是 SessionID + QuestionID,您必须在这两个表的两列上指定连接:

FROM Answer   AS a
JOIN Question AS q ON q.SessionID = a.SessionID AND q.QuestionID = a.QuestionID

如果没有这两者,当一个问题 ID 出现在多个会话中时,您最终会产生笛卡尔积效应。

此外,由于您没有选择 SessionID,因此您需要处理两个不同会话具有相同问答信息的重复结果。我认为 SELECT DISTINCT 可能比 GROUP BY 更好。当您有聚合(例如 COUNT(*) 或 SUM(expression))并且不将其用于一般的“重复消除”时,请保留 GROUP BY。


原始评论

我相信你的问题有两个部分——一个可能不重要,另一个可能很重要。

您的查询或多或少是:

SELECT q.QuestionContent, o.OptionType, q.NoofAnswers, a.Answer, r.ReplyType,
       q.QuestionMarks
FROM Answer a                
INNER JOIN Question q ON a.QuestionId = q.QuestionId
      JOIN Reply r ON q.ReplyId = r.ReplyId
      JOIN Question qu ON r.ReplyId = qu.ReplyId
      JOIN Option_Table o ON qu.OptionId = o.OptionId
GROUP BY q.QuestionContent

出于某种原因,您已经在其中两次列出了 Question,但没有证据表明您需要第二个别名。仅在此基础上,您就可以将查询简化为:

SELECT q.QuestionContent, o.OptionType, q.NoofAnswers, a.Answer, r.ReplyType,
       q.QuestionMarks
  FROM Answer       AS a                
  JOIN Question     AS q ON a.QuestionId = q.QuestionId
  JOIN Reply        AS r ON q.ReplyId = r.ReplyId
  JOIN Option_Table AS o ON q.OptionId = o.OptionId
 GROUP BY q.QuestionContent

那可能不是关键的变化;你似乎有一个 1:1 的加入。优化器可能会忽略对 Question 表的多余的第二次引用,但不提及未使用的更好。

可能关键的问题是 GROUP BY 子句。在大多数 SQL 方言中,您需要在 GROUP BY 子句中列出所有非聚合选定值。在这个查询中,没有显示非聚合,这意味着列出所有 6 个结果列。当你不这样做时,MySQL 会随机处理一些事情。我的怀疑是您需要揭示完整查询中是否有任何聚合,并解释 GROUP BY 应该为您做什么。我不确定简单地省略它是否会给您所需的答案,或者您是否需要做其他事情。缺乏确定性的一个原因是问题中缺乏模式;关于表的模式以及它们之间的主键、外键关系,我们无法透露太多。

所以,我建议使用(尝试):

SELECT q.QuestionContent, o.OptionType, q.NoofAnswers, a.Answer, r.ReplyType,
       q.QuestionMarks
  FROM Answer       AS a                
  JOIN Question     AS q ON a.QuestionId = q.QuestionId
  JOIN Reply        AS r ON q.ReplyId = r.ReplyId
  JOIN Option_Table AS o ON q.OptionId = o.OptionId

If that gives 'the wrong number of rows', then you need to explain the schema and the relationships between the rows.

于 2012-05-25T13:21:13.750 回答
0

您正在从不同的表中选择答案。(a.amswers) 你应该做 q.Answer。

于 2012-05-25T11:52:14.757 回答