查询结果不正确

时间:2012-05-25 11:44:56

标签: mysql sql database

我的查询结果出错了。它没有使用“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

UPDATE:BELOW是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 

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

3 个答案:

答案 0 :(得分: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

现在,您可以使用任意数量的答案类型,并且每个问题允许多个答案。

答案 1 :(得分: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(表达式)),请保留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

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

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的加入。优化器可能会忽略对问题表的多余第二个引用,但是没有提到未使用的更好。

可能至关重要的问题是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

如果这给出'错误的行数',那么你需要解释模式和行之间的关系。

答案 2 :(得分:0)

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