2010-11-29 9 views
0

LÖSUNG: Wenn jemand interessiert:MySQL JOIN Problem

SELECT login_id, hotel_name, AVG(q1) AS q1, AVG(q2) AS q2, AVG(q3) AS q3, AVG(q4) AS q4, AVG(q5) AS q5, AVG(q6) AS q6, AVG(q7) AS q7, AVG(q8) AS q8, AVG(q9) AS q9, AVG(q10) AS q10, AVG(q11) AS q11, AVG(q12) AS q12, AVG(q13) AS q13, AVG(q14) AS q14, AVG(q15) AS q15, AVG(q16) AS q16, AVG(q17) AS q17, AVG(q18) AS q18, AVG(q19) AS q19, AVG(q20) AS q20, AVG(q21) AS q21, AVG(q22) AS q22 
FROM thotels_respondents 
LEFT JOIN thotels_results ON thotels_respondents.login_id = thotels_results.company 
AND q24 =5 
AND thotels_results.date = 'NOV2010' 
AND thotels_results.brand = 'XYZ' 
WHERE 
AND login_id = '66j8ttk2' 
GROUP BY login_id 

Durch die thotels_results.date bewegen und .brand, bevor die WHERE-Klausel das Problem behoben.

Morgen alle,

Hoffentlich jemand in der Lage sein wird, zu helfen - ich zu ahnen, dass ich etwas ganz offensichtlich ...

vermisst habe ich habe zwei Tabellen in MySQL hotel_respondents und hotel_results - sie Hinzu kommen hotel_respondents.login_id = hotel_results.company

habe ich folgende Daten in hotel_results Tabelle:

date  brand code  q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20 q21 q22 q23 q24 q25 

NOV2010 XYZ 66j8ttk2 8 6 4 8 3 8 8 8 7 4 8 7 7 4 7 6 6 7 4 5 7 7 2 1 1 
NOV2010 XYZ 66j8ttk2 9 9 5 5 5 5 3 3 9 9 9 5 6 8 6 8 8 5 5 5 6 6 2 1 1 
NOV2010 XYZ 66j8ttk2 10 10 7 10 8 10 10 9 8 10 10 10 8 10 10 10 10 10 10 10 10 10 1 1 1 
NOV2010 XYZ 66j8ttk2 8 6 4 8 3 8 8 8 7 4 8 7 7 4 7 6 6 7 4 5 7 7 2 1 1 
NOV2010 XYZ 66j8ttk2 9 10 9 9 7 10 10 10 9 9 9 10 10 8 10 9 10 10 10 10 10 7 1 1 1 
NOV2010 XYZ 66j8ttk2 10 10 10 6 10 10 10 10 6 10 10 10 10 1 10 10 10 10 10 10 10 10 1 2 1 
NOV2010 XYZ 66j8ttk2 10 7 6 9 7 9 8 8 8 6 8 7 10 5 9 8 8 8 7 9 8 8 1 2 1 
NOV2010 XYZ 66j8ttk2 8 8 7 7 9 9 10 1 8 10 10 9 8 8 9 8 8 7 8 8 8 9 1 2 1 
NOV2010 XYZ 66j8ttk2 6 6 5 7 7 5 7 6 5 3 7 4 5 8 5 7 8 7 5 4 7 3 2 2 1 
NOV2010 XYZ 66j8ttk2 10 9 10 9 10 10 8 10 9 10 10 9 9 6 9 9 9 10 9 9 9 8 2 3 2 
NOV2010 XYZ 66j8ttk2 5 9 2 6 2 2 10 10 6 2 10 2 2 2 5 5 5 10 5 2 8 8 2 4 1 
NOV2010 XYZ 66j8ttk2 9 8 5 7 7 9 9 9 10 10 9 7 9 6 8 8 7 8 9 10 7 10 2 4 1 

Jetzt in Excel ich eine AVERAGE für jede Frage, wo q24 = 1 und die folgenden Ergebnisse zurückgegeben werden.

q1  q2  q3  q4  q5  q6  q7  q8  q9  q10  q11  q12  q13  q14  q15  q16  q17  q18  q19  q20  q21  q22   
8.80 8.20 5.80 8.00 5.20 8.20 7.80 7.60 8.00 7.20 8.80 7.80 7.60 6.80 8.00 7.80 8.00 7.80 6.60 7.00 8.00 7.40 

Nein, kann ich die Ergebnisse in MySQL mit dem folgenden Code replizieren:

SELECT login_id, hotel_name, AVG (q1) AS q1, AVG (q2) AS q2, AVG (q3) AS q3, AVG (q4) AS q4, AVG (q5) AS q5, AVG (q6) AS q6, AVG (q7) AS q7, AVG (q8) AS q8, AVG (q9) AS q9, AVG (q10) AS q10, AVG (q11) AS q11, AVG (q12) AS q12, AVG (q13) AS q13, AVG (q14) AS q14, AVG (q15) AS q15, AVG (q16) AS q16, AVG (q17) AS q17, AVG (q18) AS q18, AVG (q19) AS q19, AVG (q20) AS q20, AVG (q21) AS q21, AVG (q22) AS q22 FROM thotels_respondents LEFT JOIN thotels_results ON thotels_respondents.login_id = thotels_results.company AND q24 = 1 WHERE thotels_results.brand = 'XYZ' AND thotels_results.date = 'NOV2010' AND login_id = '66j8ttk2' GROUP BY hotel_name; 

Das Problem, das ich habe, ist wie folgt - der Code den richtigen Satz von Ergebnissen in MySQL gibt, solange q24 hat eine der 1,2,3,4,5 in der Tabelle. Wie Sie jedoch aus den obigen Daten sehen können - für Q24 gibt es NO 5.

Also, wenn Sie den folgenden Code ausführen:

SELECT login_id, hotel_name, AVG (q1) AS q1, AVG (q2) AS q2, AVG (q3) AS q3, AVG (q4) AS q4, AVG (q5) AS q5, AVG (q6) AS q6, AVG (q7) AS q7, AVG (q8) AS q8, AVG (q9) AS q9, AVG (q10) AS q10, AVG (q11) AS q11, AVG (q12) AS q12, AVG (q13) AS q13, AVG (q14) AS q14, AVG (q15) AS q15, AVG (q16) AS q16, AVG (q17) AS q17, AVG (q18) AS q18, AVG (q19) AS q19, AVG (q20) AS q20, AVG (q21) AS q21, AVG (q22) AS q22 FROM thotels_respondents LEFT JOIN thotels_results ON thotels_respondents.login_id = thotels_results.company AND q24 = 5 WHERE thotels_results.brand = 'XYZ' AND thotels_results.date = 'NOV2010' AND login_id = '66j8ttk2' GROUP BY hotel_name; 

Es keine Daten zurückgibt, einfach diese Meldung:

MySQL returned an empty result set (i.e. zero rows). (Query took 0.2381 sec) 

Was ich für meinen Code und Seite müssen korrekt arbeiten um tatsächlich eine Reihe von NULLs zurückzubringen, wenn q24 keine Antworten für 1 bis 5 hat - so

Ich habe versucht, den Code zu ändern, um dies zu tun, aber wenn ich es tue, schließe ich die Berechnungen aus - ich bin mir sicher, dass ich mit der JOIN etwas falsch mache, aber nicht herausfinden kann, wo ich falsch liege.

Alle und alle Hilfe dankbar erhalten !!!

Vielen Dank im Voraus,

Homer.

Antwort

0

Nur ein Gedanke ... Wenn Sie COUNT (*) hinzufügen, um totalRecords für Ihre Abfrage darzustellen. Ich denke, dass sollte immer eine Ergebnismenge von null Datensätze zurückgeben, obwohl die Anzahl = 0. MySQL nicht hier, aber sollte funktionieren.

+0

Leider hat das DRapp aber nicht geholfen - hab jetzt eine Lösung gefunden. –

1

Sie haben es also gelöst, aber Sie haben die Erklärung nicht hinzugefügt - hier ist es der Vollständigkeit halber.

Der Unterschied zwischen den beiden Abfragen liegt in der Tatsache, dass eine LINKE VERBINDUNGEN unter bestimmten Bedingung und die anderen LINKEN VERBINDUNGEN und dann Bedingung an die Ergebnisse anwendet.

Nun, die Bedeutung ist anders - wenn Sie zuerst JOIN LINKS und dann anwenden, wo Bedingung, die Bedingung auf eine Spalte aus der Tabelle auf der rechten Seite des LINKEN JOIN anwendet, dann wird es alle Zeilen, wo die rechte Seite fehlt . Dies liegt an der Tatsache, dass die Bedingung thotels_results.date = 'NOV2010' nicht wahr ist, wenn thotels_reults.date IS NULL.

Wenn die Bedingung jedoch im LEFT JOIN angewendet wird, spielt es keine Rolle, dass es nicht wahr ist - die Definition von LEFT JOIN ist - gibt eine Zeile mit NULL für Zeilen zurück, in denen die Join-Bedingung FALSE ist.

Daher unterschiedliche Resultsets - aufgrund der Tatsache, dass die Bedingung in unterschiedlichem Sinne angewendet wird.

Wenn Sie das gleiche Ergebnis mit dem bekommen, wo Sie jede Bedingung ersetzen müssen wie thotels_results.date = 'NOV2010' mit thotels_results.date = 'NOV2010' OR thotels_results.date IS NULL - weil man nicht nur den Zeilen will, wo das Feld auf einen Wert gleich ist, aber Sie wollen die Zeilen, in denen es ist Null.

+0

Danke für das Hinzufügen der Erklärung. –