2010-11-18 16 views
0

Ich habe 2 Tabellen:Problem mit MySQL-Abfrage

Die Frage Tabelle mit der folgenden Struktur:

id 
title 
userid 
date 

und Antworten Tabelle mit der folgenden Struktur:

id 
idquestion 
userid 
message 
date 

Ich mag zeigen, alle Fragen und die letzte Antwort auf diese Frage.

Zum Beispiel, wenn wir 5 Fragen haben, würde Ich mag so etwas bekommen:

id title message messagedate 
1  qs 1 mess 1 2010-11-18 
2  qs 2 mess 2 2010-11-19 
3  qs 3 mess 3 2010-11-20 
4  qs 4 mess 4 2010-11-21 

Meine Anfrage bisher:

SELECT q.id, qa.id as answerid, title, qa.message 
     FROM `questions` q 
INNER JOIN questions_answers qa 
     ON q.id = qa.idquestion 
    GROUP BY q.id 
    ORDER BY q.id, answerid DESC 

Aber es korrekt funktioniert nicht, es Gruppen durch die Frage ID (alle anderen Spalten Nachrichten entfernen, nur die erste Nachricht verlassen - so die Bestellung von ist nutzlos)

Jede Hilfe geschätzt. Danke

+0

Können Sie einige Beispieldaten in den Tabellen veröffentlichen, genau zu zeigen, wie Sie die Ausgabe wollen aus den gespeicherten Daten erzeugt werden? (Zum Beispiel scheint es einfach zu sein, die GROUP BY zu entfernen, aber ich glaube nicht, dass Sie das letztendlich wollen) ... – ircmaxell

+0

Wenn ich die Gruppe durch lösche, bekomme ich alle Antworten. Zum Beispiel, wenn ich eine Frage mit 2 Antworten habe, werde ich 2 Reihen für diese Frage anstelle von einem zeigen. Wenn ich X-Fragen habe, möchte ich X-Zeilen bekommen, wenn ich die Abfrage mache, also nur die letzte Antwort/Frage, – FinalDestiny

Antwort

2

Das alte Problem. Hier ist die Lösung: http://dev.mysql.com/doc/refman/5.1/en/example-maximum-column-group-row.html

In Ihrem Fall:

SELECT q.id, qa.id as answerid, title, qa.message 
FROM questions q 
JOIN questions_answers qa ON q.id = qa.idquestion 
LEFT JOIN questions_answers qa2 ON qa.idquestion = qa2.idquestion AND qa.date < qa2.date 
WHERE qa2.idquestion IS NULL 

(Die Idee ist, das Problem in zwei Operationen aufgeteilt. Einer von Fragen zu Antworten kommt und dann mit den Methoden aus dem MySQL-Artikel)

+0

Ich möchte es nur mit 1 Abfrage tun, keine Unterabfragen. – FinalDestiny

+0

Dann vielleicht nur die Lösung mit dem LINKEN JOIN !? – AndreKR

+0

Ich habe zwei verschiedene Tabellen, nicht nur eine wie das Beispiel hat. Also kann ich nicht herausfinden, wie es geht. Kannst du mir ein bisschen bei der Abfrage helfen? Danke, – FinalDestiny

0

Nun könnte man es anders angehen. Sie verwenden einen inneren Join, was bedeutet, dass Sie keine Fragen ohne Antwort anzeigen werden. Suchen Sie also nach der maximalen Antwort, gruppiert nach der Frage-ID, und schließen Sie sich der Fragetabelle an, um den Titel zu erhalten.

SELECT q.id, qa.id as answerid, q.title, qa.message FROM questions q INNER JOIN question_answers qa ON q.id = qa.idquestion AND qa.id IN (SELECT MAX(id) FROM question_answers WHERE idquestion = q.id) GROUP BY q.id ORDER BY q.id DESC

+0

Das funktioniert ganz gut für die qa.id, aber die qa.message ist falsch, immer noch die erste. Zum Beispiel möchte ich den letzten Benutzer finden, der auf diese Nachricht geantwortet hat, der MAX wird hier nicht funktionieren, – FinalDestiny

+0

Nein, das wird eine beliebige Nachricht für qa.message geben, nicht die neueste. – AndreKR

+0

Ich habe getestet und ja, die Nachricht wurde durcheinander gebracht, hier ist es, funktional mit einer Unterabfrage, aber es ist nicht so schön wie AndreKR: p –