2016-05-26 13 views
1

Ich habe ein Problem, meine Abfrage so zu bekommen, wie ich es möchte. Ich habe 2 Tabellen: Passagen und Fragen Tabellenmysql Abfrage, um aus verwandten Tabellen zweimal zu zählen

Die Fragen Tabelle hat einen Fremdschlüssel einer Passage. Die Fragentabelle enthält eine Spalte mit dem Status "Aktiv", "Inaktiv" oder "Überprüfung". Ich war in der Lage, die Anzahl der aktiven Fragen zu ermitteln, aber jetzt möchte ich auch die Anzahl der Fragen in die Bewertung aufnehmen, aber ich kann es nicht richtig finden. Das Folgende ist das, was ich bisher herausgefunden habe, aber die Spalte für die Frageeinsicht gibt mir die gleiche Nummer wie die Anzahl der Fragen.

Wie sollte ich meine Abfrage einrichten, um die Anzahl der Fragen in der Überprüfung auch zu bekommen?

EDIT:

Nach Herumspielen mit dem, was hier vorgeschlagen wurde, ist das, was ich

Lösung zu bekommen:

SELECT 
    p.id, 
    SUM(CASE WHEN q."status" = 'active' THEN 1 ELSE 0 END) AS numQuestions, 
    SUM(CASE WHEN q."status" = 'review' THEN 1 ELSE 0 END) AS questionsInReview, 
    ROUND(AVG(CASE WHEN q."status" = 'active' THEN q."level" ELSE Null END)) as questionLevel 
FROM "Passages" AS p 
LEFT JOIN "Questions" as q ON p.id = q."PassageId" 
GROUP BY p.id 
ORDER BY p.id ASC 

Antwort

1

Was ist so etwas wie (nicht getestet):

SELECT p.id, 
     COUNT(q.id) AS numQuestions, 
     SUM(q.status = "review") AS questionsInReview, 
     ROUND(AVG(if(q.status = "active", q.level, null)) as questionLevel 
FROM Passages AS p 
LEFT JOIN Questions as q ON p.id = q.PassageId AND q.status = 'active' 
GROUP BY p.id 
ORDER BY p.id ASC 
+0

Dies funktioniert für mich das Beste, da es die einfachste Lösung war. Bearbeitete die Frage, um die Lösung zu haben. Musste diese Abfrage ein wenig optimieren, damit es funktioniert – paulducsantos

1

Das Problem mit Ihrer Antwort ist, dass Sie nur Zeilen zählen - da Sie joi sind ning ist die Anzahl der Zeilen gleich.

versuchen, diesen Ansatz:

SELECT id, sum(active) as sum_active, sum(review) as sum_review from (
    SELECT p.id, 
    CASE q.status WHEN 'active' 1 ELSE 0 AS active, 
    CASE q.status WHEN 'review' 1 ELSE 0 AS review 
    FROM Passages as p inner join Questions as q ON p.id = q.passageId 
) group by id 

Die Ideen- die innere Abfrage werden Ihnen nur für aktive und Bewertung binäre Spalten geben. Auf diese Weise können Sie einfach zusammenfassen, um das Ergebnis zu erhalten

Verwandte Themen