【问题标题】:Return data from several tables in database从数据库中的几个表中返回数据
【发布时间】:2012-05-09 14:59:50
【问题描述】:

我需要一些帮助来从多个表中获取数据。

这是我的桌子:

_______________   ______________   ___________  _______________  _____________
|_tblUsers____|   |_tblAnswers__|  |_tblAlt__|  |_tblQuestion_|  |_survey_____|
| userID      |   | answerAltID |  | altID   |  | questID     |  | surveyID   |
| username    |   | userID      |  | altText |  | questText   |  | surveyName |
|_____________|   |_____________|  |_questID_|  |_surveyID____|  |____________|

TblUsers 拥有系统中的用户列表,tblAnswers 拥有用户给出的所有答案,tlbAlt 拥有问题的备选方案,tblQuestion 拥有问题。还有一个名为 tblSurveys 的表,但这里不需要,因为 tblQuestion 中提到了 ID。

这是我目前所拥有的:

SELECT
tblQuestion.questText,
tblAlt.altText,
Count(tblAnswers.answerID) as answers_count,
(SELECT COUNT(answerID) FROM tblAnswers, tblAlt 
WHERE tblAnswers.answerAltID = tblAlt.altID 
AND tblAlt.questID = " & CInt(questionID) & ") as total_count
FROM tblAlt, tblQuestion
LEFT JOIN tblAnswers ON (tblAlt.altId = tblAnswers.altID)
WHERE tblAlt.questID = " & CInt(questionID) & "
GROUP BY tblAlt.altText;

这会返回这样的行:

|什么是布拉布拉布拉? |答案是... | 2 (已回答) | 10(总 答案)|

不幸的是,这只会返回一个问题的所有行。有没有办法获取属于同一调查的所有行(基于surveyID)?

如果希望输出是这样的:

|什么是布拉布拉布拉? |答案是... | 2 (已回答) | 10(总 答案)|调查名称 |

我想返回所有备选方案(包括回答的数量、答案总数、相关问题和调查)。


更新:

这是我的输入:

SELECT tblalternativ.altTekst, tblalternativ.altID, Count(tblsvar.svarAltID) as antSvar, 
(SELECT COUNT(*) FROM tblsvar, tblalternativ 
WHERE tblsvar.svarAltID = tblalternativ.altID 
AND tblalternativ.altSpmID = " & CInt(lblQuestion.Tag) & ") as antTotal, 
(SELECT Count(*) FROM tblalternativ WHERE altSpmID = " & CInt(lblQuestion.Tag) & ") as spmTotal 
FROM(tblalternativ) LEFT JOIN tblsvar ON (tblalternativ.altId = tblsvar.svarAltID) 
WHERE(tblalternativ.altSpmID = " & CInt(lblQuestion.Tag) & ")
GROUP BY tblalternativ.altTekst ORDER BY tblalternativ.altID ASC

我的输出:

altTekst    altID   antSvar antTotal    spmTotal
Black         83         1      3              5
Green         84         1      3              5
Yellow        85         1      3              5
White         86         0      3              5
Pink          87         0      3              5

但这仅显示一个问题的统计信息。我想在一项调查中显示所有问题。因此,我需要为该调查、问题名称和调查 ID 获取所有 altTekst

我想要:

spmTekst      altTekst  altID   antSvar antTotal    spmTotal   evalID
What is...    Black         83         1        3          5        1
What is...    Green         84         1        3          5        1
What is...    Yellow        85         1        3          5        1
What is...    White         86         0        3          5        1
What is...    Pink          87         0        3          5        1
Who is....    The king      88         2        3          3        1
Who is....    The pope      89         0        3          3        1
Who is....    The president 90         1        3          3        1
Which....     Shoe          91         2        3          2        1
Which....     Hat           92         1        3          2        1

换句话说,我想要来自同一调查中所有问题的统计数据(基于 evalID)。

【问题讨论】:

  • 天哪,你为什么不显示一个示例输出表,除了这个文字描述之外,期望的输出是什么样的?
  • 如果您非常确定这是您想要的输出,那么您说But this only show statistics for one question. 是错误的。实际上,只需使用正确的查询选择两个额外的列
  • 这里的 spmTekst 和 evalID 是什么?哪个表的哪一列?
  • spmTekst 是 questText,evalID 是surveyID。
  • 我知道这只是选择两个额外的列(从两个表中),但添加到我的查询中并不容易。 :)

标签: mysql


【解决方案1】:

返回所有问题、答案文本、具有该答案的用户数以及提供的答案总数;每次调查。

Select TQ.QuestText, tAlt.altText, count(*) as Answers_count, suM(mTemp.Cnt) as total_count
FROM tblQuestion tq
LEFT JOIN tblAlt talt on Talt.QuestID = TQ.QuestID
LEFT JOIN tblAnswers ta on ta.AnswerAltID = talt.AltID
LEFT JOIN tblUsers tu ON Ta.UserID = TU.UserID
LEFT join tblAnswers ta2 on ta2.answeraltId = talt.altID
LEFT JOIN 
  (SELECT COUNT(*) cnt, questID 
   FROM tblAnswers 
   INNER JOIN tblAlt on AltID = AnswerAltID
   group by questID) mTemp 
  on mTemp.QuestID = talt.QuestID
WHERE tQ.SurveyID = 123 --Change this to your value
Group by TQ.QuestText, TAlt.AltText

这只是一堆左连接与内连接;我抽象出每个表的计数一次,所以它应该更快,而不是在每一行上进行子选择。这样,它对所有行执行一次并完成。

【讨论】:

  • 我在最后一个 LEFT JOIN 之后收到“未知列 questID”。
  • 我将 nTemp 更正为 mTemp。我还在顶部添加了 sum(mtemp.cnt)。
  • 是的,我在您编辑后尝试过。不幸的是,它给了我错误。
  • hmm...也许内部连接需要一个group by...虽然不认为在mysql中需要它...注意我无法测试这个,因为我没有目前可以访问mysql。
  • 已经试过了,还有其他几件事。现在对我来说肯定变得太复杂了。
【解决方案2】:

试试这个(完全没有优化,只是添加了调查部分):

SELECT    tblQuestion.questText, tblAlt.altText, 
          Count(tblAnswers.answerAltID) AS answers_count,
           (SELECT COUNT(answerAltID) FROM tblAnswers, tblAlt 
           WHERE  tblAnswers.answerAltID = tblAlt.altID AND 
                  tblAlt.questID = " & CInt(questionID) & ") as total_count,
          survey.surveyName
FROM      survey, tblQuestion, tblAlt
LEFT JOIN tblAnswers ON (tblAlt.altId = tblAnswers.answerAltID)
WHERE     tblAlt.questID = " & CInt(questionID) & " AND 
          tblQuestion.surveyID = survey.surveyID
GROUP BY  tblAlt.altText;

编辑:然后试试这个:

SELECT    tblQuestion.questText AS spmTekst, tblAlt.altText AS altTekst, 
          tblAlt.altID, 
          Count(tblAnswers.answerAltID) AS antSvar,
          COUNT(tblAlt.altID) AS antTotal,
          COUNT(tblQuestion.questID) AS spmTotal,
          survey.surveyID AS evalID
FROM      tblQuestion 
JOIN      survey ON (survey.surveyID = tblQuestion.surveyID)
JOIN      tblAlt ON (tblAlt.questID = tblQuestion.questID)
LEFT JOIN tblAnswers ON (tblAnswers.answerAltID = tblAlt.altID)
WHERE     tblAlt.questID = " & CInt(questionID) & " AND -- what really is this? review this
          survey.surveyID = '123' -- the value u want
GROUP BY  tblAlt.altText
ORDER BY  tblAnswers.answerAltID;

【讨论】:

  • 似乎没问题,但收到错误 Unknown column 'tblAnswers.answerID' in 'field list'。我猜这是第一个 Count()。
  • @user880980 实现我在此处发布的您自己的查询。只需确保您在此处发布的查询是有效的。正如我在您的表结构中看到的那样,也许是tblAnswers.answerAltID
  • 是的,我解决了这个问题。但我什至在Unknown column 'tblAlt.altID' in 'on clause' 上遇到错误。
  • @user880980 那样的话我很无奈,不知道是什么原因。也许我可以编辑我的答案以优化查询,这可能有助于摆脱该错误
  • 现在工作。我在 FROM 中交换了 tblAlt 和调查的位置。但这并没有返回我真正想要的。我想返回所有备选方案(回答的数量、总答案、相关问题和调查)。将此信息添加到我的帖子中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多