gpt4 book ai didi

mysql - 查询结果不正确

转载 作者:行者123 更新时间:2023-11-29 08:52:44 24 4
gpt4 key购买 nike

我的查询结果有问题。它没有显示带有“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

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

最佳答案

鉴于 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 出现在多个 session 中时,您最终会得到笛卡尔积效应。

此外,由于您没有选择 SessionID,因此您将需要处理重复的结果,其中两个不同的 session 具有相同的问题和答案信息。我认为 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 加入。优化器也许能够忽略对 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

如果给出“错误的行数”,那么您需要解释架构和行之间的关系。

关于mysql - 查询结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10753844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com