2 Stimmen

Daten aus mehreren Tabellen in der Datenbank zurückgeben

Ich brauche Hilfe dabei, Daten aus mehreren Tabellen zu bekommen.

Das sind die Tabellen, die ich habe:

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

TblUsers enthält eine Liste der Benutzer im System, tblAnswers hat alle Antworten, die von Benutzern gegeben wurden, tblAlt enthält Alternativen zu einer Frage, und tblQuestion hat die Fragen. Es gibt noch eine Tabelle namens tblSurveys, aber die wird hier nicht benötigt, da die ID in der tblQuestion erwähnt wird.

Das ist, was ich bisher habe:

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;

Dies liefert Zeilen wie diese:

| Was ist blablabla? | Die Antwort ist... | 2 (haben geantwortet) | 10 (insgesamt geantwortet) |

Leider liefert dies nur alle Zeilen für eine Frage zurück. Gibt es eine Möglichkeit, alle Zeilen zu erhalten, die zu derselben Umfrage gehören (basierend auf surveyID)?

Wenn ich möchte, dass die Ausgabe so aussieht:

| Was ist blablabla? | Die Antwort ist... | 2 (haben geantwortet) | 10 (gesamt geantwortet) | Name der Umfrage |

Ich möchte ALLE Alternativen zurückgeben (mit Angabe, wie viele geantwortet haben, Gesamtanzahl der Antworten, zugehörige Frage und Umfrage).


Aktualisierung:

Das ist meine Eingabe:

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

Meine Ausgabe:

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

Aber das zeigt nur Statistiken für eine Frage an. Ich möchte die Statistiken für alle Fragen in einer Umfrage anzeigen. Also muss ich alle altTekst für diese Umfrage, den Fragennamen und die ID der Umfrage bekommen.

Ich möchte:

spmTekst      altTekst  altID   antSvar antTotal    spmTotal   evalID
Was ist...    Black         83         1        3          5        1
Was ist...    Green         84         1        3          5        1
Was ist...    Yellow        85         1        3          5        1
Was ist...    White         86         0        3          5        1
Was ist...    Pink          87         0        3          5        1
Wer ist....    Der König      88         2        3          3        1
Wer ist....    Der Papst      89         0        3          3        1
Wer ist....    Der Präsident 90         1        3          3        1
Welcher....     Schuh          91         2        3          2        1
Welcher....     Hut           92         1        3          2        1

Mit anderen Worten möchte ich die Statistiken für alle Fragen in derselben Umfrage anzeigen (basierend auf evalID).

3voto

xQbert Punkte 34067

Um alle Fragen, Antworttexte, die Anzahl der Benutzer mit dieser Antwort und die insgesamt gegebenen Antworten pro Umfrage zurückzugeben.

Wählen Sie TQ.QuestText, tAlt.altText, count(*) als Answers_count, suM(mTemp.Cnt) als Gesamtanzahl aus
VON tblQuestion tq
LINKS BEITRETEN tblAlt talt an Talt.QuestID = TQ.QuestID
LINKS BEITRETEN tblAnswers ta an ta.AnswerAltID = talt.AltID
LINKS BEITRETEN tblUsers tu AN Ta.UserID = TU.UserID
LINKS BEITRETEN tblAnswers ta2 an ta2.answeraltId = talt.altID
LINKS BEITRETEN 
  (WÄHLEN SIE COUNT(*) cnt, questID aus
   VON tblAnswers 
   INNEN BEITRETEN tblAlt an AltID = AnswerAltID
   Gruppieren nach questID) mTemp 
  AUF mTemp.QuestID = talt.QuestID
WO tQ.SurveyID = 123 --Ändern Sie diesen Wert
Gruppieren nach TQ.QuestText, TAlt.AltText

Es handelt sich nur um eine Reihe von Left Joins gegen Inner Joins; und ich habe die Zählungen für jede Tabelle abstrahiert, damit es schneller sein sollte, anstatt einen Unterselect für jede Zeile zu machen. Auf diese Weise wird es einmal für alle Zeilen durchgeführt und ist erledigt.

1voto

nawfal Punkte 65966

Probieren Sie dies (überhaupt nicht optimiert, habe nur den Umfrage-Teil hinzugefügt):

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;

Bearbeiten: Probieren Sie dann dies:

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 -- was ist das wirklich? überprüfen Sie dies
          survey.surveyID = '123' -- der Wert, den Sie wollen
GROUP BY tblAlt.altText
ORDER BY tblAnswers.answerAltID;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X