Select DISTINCT ORDER BY
Thomas
- datenbank
Hallo zusammen,
Ich hab grad ein kleines SQL-Problem, bei dem ich momentan auf dem Schlauch stehe.
Und zwar habe ich die folgende Datenbanktabelle:
tabForumBeitrag (int id, text thema, text beitrag, int datecmp, int kategorie)
Nun versuche ich, eine Liste aller Themen auszugeben und diese so zu sortieren, dass das Thema mit dem neusten Beitrag oben steht.
SELECT DISTINCT thema FROM tabForumBeitrag WHERE kategorie=$Kategorie ORDER BY datecmp DESC
Problem:
Hier führt SQL zuerst das Select DISTINCT aus und sortiert anschließend die Ergebnismenge. So kann es passieren, dass die Sortierung nicht korrekt ist.
SELECT DISTINCT thema, datecmp FROM tabForumBeitrag WHERE kategorie=$Kategorie ORDER BY datecmp DESC
Problem:
So listet SQL natürlich aufgrund des hinzugekommenen Attributs datecmp jedes Thema mehrfach auf.
Ich suche nun praktisch nach einer Abfrage, das mir jedes Thema nur einzeln ausgibt und trotzdem datecmp als Sortierkriterium berücksichtigt.
Ich habs auch mal mit dem folgenden Sub-Select versucht:
SELECT DISTINCT thema FROM (SELECT thema, datecmp FROM tabForumBeitrag WHERE kategorie=8 ORDER BY datecmp DESC)
Da gibt mir MySQL aber die folgende Fehlermeldung zurück:
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT thema , datecmp FROM tabForumBeitrag WHERE kategorie = 8
Hat jemand eine Idee?
Vielen Dank vorab für die Hilfe,
Thomas
Hallo Thomas,
Nun versuche ich, eine Liste aller Themen auszugeben und diese so zu sortieren, dass das Thema mit dem neusten Beitrag oben steht.
SELECT DISTINCT thema FROM tabForumBeitrag WHERE kategorie=$Kategorie ORDER BY datecmp DESC
ist ein völlig ungeeigneter Ansatz.
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT thema , datecmp FROM tabForumBeitrag WHERE kategorie = 8
Welche MySQL-Version ist im Einsatz. Du benötigst mindestens 4.1 für Subselects.
Wie das prinzipiell mit einem korrelierten Subselect geht, habe ich in diesem Archivposting an einem Beispiel erläutert.
Freundliche Grüße
Vinzenz
yo,
Wie das prinzipiell mit einem korrelierten Subselect geht, habe ich in diesem Archivposting an einem Beispiel erläutert.
eventuell funkioniert auch ein anderer weg, wobei ich mir da nicht ganz sicher bin, wann mysql die ORDEBY BY klausel ausführt. auf jeden fall kann man die korrelation vermeiden.
SELECT thema, MAX(datecmp) AS datum
FROM tabForumBeitrag
WHERE kategorie=$Kategorie
GROUP BY thema
ORDER BY datum DESC
oder aber
SELECT tab.thema, tab.datum
FROM
(
SELECT t1.thema, MAX(t1.datecmp) AS datum
FROM tabForumBeitrag t1
WHERE t1.kategorie=$Kategorie
GROUP BY t1.thema
) tab
ORDER BY tab.datum DESC
Ilja
Hallo Ilja,
Wie das prinzipiell mit einem korrelierten Subselect geht, habe ich in diesem Archivposting an einem Beispiel erläutert.
eventuell funkioniert auch ein anderer weg, wobei ich mir da nicht ganz sicher bin, wann mysql die ORDEBY BY klausel ausführt. auf jeden fall kann man die korrelation vermeiden.
> SELECT thema, MAX(datecmp) AS datum
> FROM tabForumBeitrag
> WHERE kategorie=$Kategorie
> GROUP BY thema
> ORDER BY datum DESC
ja klar. Solange man außer dem neuesten Datum nur Spalten mitnimmt, nach denen man problemlos gruppieren kann, benötigt man kein Subselect.
Erst wenn man Detailangaben (hier zum Thema, z.B. eine Überschrift, einen Autor oder was weiß ich sonst noch) haben will, benötigt man die Unterabfrage. So steht es auch in meinem verlinkten Archivbeitrag.
Freundliche Grüße
Vinzenz
yo,
ja klar. Solange man außer dem neuesten Datum nur Spalten mitnimmt, nach denen man problemlos gruppieren kann, benötigt man kein Subselect.
benötigt er den mehr ? falls nicht, kann er nämlich die vorrausetzung von 4.1+ umgehen. und dein beitrag klang ein wenig so, als wenn er das auf jeden fall braucht ?
Ilja