2 Stimmen

Wie kann ich diese Abfrage einfacher schreiben

Ich habe eine Abfrage, die Fragen aus einer Tabelle und Antworten aus einer anderen abruft.

SELECT 
  questions.question, 
  questions.answers, 
  (SELECT COUNT(answer) FROM answers WHERE question_id = 1 AND answer = 1 
          GROUP BY answer) as ans1, 
  (SELECT COUNT(answer) FROM answers WHERE question_id = 1 AND answer = 2 
          GROUP BY answer) as ans2 
FROM questions 
WHERE questions.id = 1

Obwohl dies funktioniert, gefällt mir die Idee nicht, für jede Antwort eine zusätzliche Unterabfrage hinzuzufügen ( questions.answers ist eine durch Komma getrennte Zeichenfolge möglicher Antworten). Es ist machbar, aber ich bin sicher, dass es einen besseren Weg geben muss. Die Hauptsache ist, dass verschiedene Fragen eine unterschiedliche Anzahl von Antworten haben.

Gibt es einen besseren Weg, dies zu tun, oder ist dies ein akzeptabler Weg, Dinge zu tun? Ich könnte mir vorstellen, dass mehrere Unterauswahlen in einer Abfrage in Zukunft einen (kleinen) Leistungseinbruch zur Folge haben könnten (nicht, dass ich die Leistung noch testen würde).

Wenn es zutrifft, erwarte ich nicht mehr als 5 Antworten pro Frage.

8voto

Bill Karwin Punkte 493880
SELECT q.question, q.answers,
  SUM(a.answer = 1) AS ans1,
  SUM(a.answer = 2) AS ans2
FROM questions q
 LEFT OUTER JOIN answers a ON (q.id = a.question_id)
WHERE q.id = 1
GROUP BY q.id;

2voto

Andru Luvisi Punkte 23151

Für mich sieht das ziemlich gut aus. Sie könnten die "group by"-Klauseln in den Unterabfragen weglassen, da Sie ohnehin nur einen Wert von "answer" auswählen.

Ich vermute, dass mit Ihrem Schema etwas nicht stimmt, wenn Sie bei jeder einzelnen Antwort eine Liste möglicher Antworten speichern. Diese sollte wahrscheinlich in einer separaten Tabelle gespeichert werden, in der jede Antwort in einer einzigen Zeile steht. Durch Trennzeichen getrennte Zeichenketten sind ein großer Fehler im Datenbankdesign, ebenso wie Duplikate von Daten, von denen man erwartet, dass sie gleich sind.

1voto

Luis Melgratti Punkte 11491

Vielleicht?

SELECT 
    questions.question, 
    questions.answers, 
    (case when answers.answer = 1 then COUNT(answer) end ) as ans1, 
    (case when answers.answer = 2 then COUNT(answer) end ) as ans2 
    FROM questions left join answers on answers.question_id = questions.id
    WHERE questionss.id = 1
    group by questions.id

0voto

cmsjr Punkte 52971

Können Sie das nicht verwenden?

SELECT 
  questions.question, 
  questions.answers, 
  COUNT(answer)

FROM questions inner join answers
on questions.id = answer.question_id
WHERE questions.id = 1
GROUP BY
questions.question, 
questions.answers

Sie würden Zeilen statt Spalten erhalten, aber ähnliche Ergebnisse.

0voto

Guss Punkte 27060

Die Standardmethode zur Verknüpfung mehrerer Zeilen in einer Tabelle mit einer oder mehreren Zeilen in einer anderen Tabelle ist die Verwendung einer Verknüpfungstabelle. Eine solche Tabelle würde in jeder ihrer Zeilen eine ID aus einer Tabelle und die ID aus der anderen Tabelle, die mit der ersten in Beziehung steht, speichern.

Für Ihre Fragen und Antworten speichern Sie die möglichen Antworten auf eine Frage in einer Verknüpfungstabelle (die ich vielleicht als question_answered ) könnte folgendermaßen aussehen:

question_id | answer_id

1 1

1 2

2 3

4 4

4 5

4 6 `

Wie Sie sehen, gibt es auf Frage 1 zwei mögliche Antworten, auf Frage 2 eine mögliche Antwort, Frage 3 wurde nicht beantwortet und auf Frage 4 gab es drei verschiedene Antworten.

Ich bin mir zwar nicht sicher, was "Antwort = 1" oder "Antwort = 2" in Ihrem Zusammenhang bedeutet, aber die Verwendung einer Verknüpfungstabelle, die alle Antworten auf eine Frage zählt, ist einfach:

SELECT question, count(answer_id) FROM questions AS q INNER JOIN question_answered AS qa ON qa.question_id = q.id) GROUP BY q.id

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