我的查询结果出错了。它没有使用“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
希望这是足够的信息,如果没有,请评论给我:)
答案 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。