2012-05-07 8 views
2

複数のテーブルからデータを取得するための助けが必要です。データベース内の複数のテーブルのデータを返す

これは私が持っているテーブルです。

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

TblUsersは、システム内のユーザーのリストを持って、tblAnswersはユーザーから与えられたすべての答えを持っている、tlbAltは質問の選択肢を保持し、tblQuestionがあり質問。 tblSurveysと呼ばれるもう1つのテーブルがありますが、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; 

これは、このような行を返します。

を| blablablaとは何ですか? |答えは... | 2(答えた)| 10(合計 答え)|

これは残念ながら、1つの質問のすべての行を返します。同じ調査(調査IDに基づく)の一部であるすべての行を取得する方法はありますか?

出力は次のようにしたい場合:

| blablablaとは何ですか? |答えは... | 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 

しかし、これだけのショーの統計。 1回の調査ですべての質問を表示したい。だから私はその調査、質問名、調査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に基づいて)同じ調査ですべての質問の統計が欲しいです。

+0

GOD私のああ、なぜまだuといけませんサンプルの出力表を表示します。希望の出力はこのテキスト記述以外にどのように表示されますか? – nawfal

+0

これがあなたが望むアウトプットであることを確信しているならば、「これは1つの質問の統計だけを表示します」と言っても間違いです。実際には、この正確なクエリ – nawfal

+0

を持つ2つの追加の列を選択するだけの問題はここにspmTekstとevalIDですか?どの列からテーブル? – nawfal

答えて

1

(すべてで最適化されていない、ちょうどそれに調査部を添加)、これを試してみてください:

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; 
+0

"Field list"に 'Unknown column' tblAnswers.answerID 'というエラーがあります。 – janlindso

+0

@ user880980ここで投稿した独自のクエリを実現しています。ここに投稿したクエリが有効なものであることを確認してください。テーブル構造に表示されているように 'tblAnswers.answerAltID'でしょうか? – nawfal

+0

はい、私は 'on clause'の中の 'Unknown column' tblAlt.altID 'にもエラーがあります。 – janlindso

3

すべての質問を返信するには、テキスト、その回答のユーザー数、および回答の合計を返すこと。調査ごとに。

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 

これは、左ジョイントと内側ジョイントの単なる束です。私は各テーブルのカウントを一度抽象化したので、各行でサブ選択を行うのではなく、より高速にすべきです。このようにして、すべての行に対して1回実行して完了します。

+0

私は最後の 'LEFT JOIN'の後に" unknown column questID "を得ています。 – janlindso

+0

nTempをmTempに修正しました。また、一番上にsum(mtemp.cnt)を追加しました。 – xQbert

+0

はい、編集した後に試しました。残念ながら、それは私にエラーを与えました。 – janlindso