Seite 1 von 1

MYSQL: max() problem

Verfasst: 23.11.2008, 23:21
von nerd
habe hier ein seltsames problem mit mysql max(). hier meine tabelle in der die texte liegen:

Code: Alles auswählen

SELECT
id,
toc_id,
title,
revision
FROM
qh_helptext

id  toc_id  name            revision
1	2	vorstellung 6.5	        1
2	2	neu: version 6.5.1        2
3	2	test revision 3	        3

toc_id ist aehnlich einer kategorie, und jedesmal wenn ein text bearbeitet wird wird dieser neu in die tabelle eingetragen (dh beim bearbeiten gibts nur inserts; kein update auf bestehende zeilen) mit einer neuen revisions nummer (int) aber der selben toc_id. auf der webseite will ich dann aber nur die letzte revision pro toc_id anzeigen.
wie bekomme ich jetzt die komplette zeile mit der letzten revision raus? mit

Code: Alles auswählen

SELECT
id,
toc_id,
title,
MAX(revision) as max_rev
FROM
qh_helptext
GROUP BY toc_id
werden meine spalten gemixt:

Code: Alles auswählen

id  toc_id  name            revision
1	2	vorstellung 6.5	        3
aber revision 3 gehoert zu id 3, "test revision 3" - was mache ich falsch?
ich brauche hier die komplette letzte zeile (id 3) als ergebniss, und nicht ein bischen was von ueberall und nirgendwo...

Verfasst:
von

Verfasst: 23.11.2008, 23:50
von net(t)worker
du musst im grunde 2 abfragen machen, erst den max wert ermitteln und dann mit diesem in einer where clausel die dazugehörigen daten ermitteln... je nach eingesetzter mysql version geht es z.B auch über 1 unterabfrage....

Verfasst: 24.11.2008, 07:50
von bloddy newbie
zum Beispiel so:

Code: Alles auswählen

SELECT
a.id,
a.toc_id,
a.title,
a.revision
FROM
qh_helptext AS a
HAVING (SELECT MAX(x.revision) FROM qh_helptext AS x WHERE x.toc_id = a.toc_id) = a.revision

Verfasst:
von

Verfasst: 24.11.2008, 11:11
von marc75
ich brauche hier die komplette letzte zeile (id 3) als ergebniss, und nicht ein bischen was von ueberall und nirgendwo...

schon mal mit order by revision asc/desc LIMIT 1 probiert

Verfasst: 24.11.2008, 13:40
von net(t)worker
bloddy newbie hat geschrieben:zum Beispiel so:

Code: Alles auswählen

SELECT
a.id,
a.toc_id,
a.title,
a.revision
FROM
qh_helptext AS a
HAVING (SELECT MAX(x.revision) FROM qh_helptext AS x WHERE x.toc_id = a.toc_id) = a.revision
na, dann versuch das mal bei mysql 3 oder 4.... da fliegen dir die fehlermeldungen nur so um die Ohren... bei mysql 5 sollte es aber so gehen....

Code: Alles auswählen

SELECT
a.id,
a.toc_id,
a.title,
a.revision
FROM
qh_helptext 
WHERE (SELECT MAX(x.revision) FROM qh_helptext AS x WHERE x.toc_id = a.toc_id) = a.revision

Verfasst: 24.11.2008, 21:59
von nerd
ah danke. aber wieso darf mysql bei aggregatfunktionen und group einfach spalten mixen - sollte hier nicht id3 die einzig gueltige zeile sein, da es keine zeile "1 2 vorstellung 6.5 3 " in meiner tabelle gibt?!

"order by" oder "limit" nuetzt mir nix, weil ich woanders auch noch von allen texten die letzte revision brauche, nicht nur von einem datensatz.

Verfasst: 24.11.2008, 22:59
von net(t)worker
du kannst doch in einer abfrage auch beliebige funktionen mischen, also gleichzeitig min() und max() einer spalte abfragen und du bekommst beides geliefert, obwohl es keinen datensatz gibt der beide werte enthält....

Verfasst: 25.11.2008, 08:51
von marc75
"order by" oder "limit" nuetzt mir nix, weil ich woanders auch noch von allen texten die letzte revision brauche, nicht nur von einem datensatz.

??? verstehe dein Problem jetzt nicht, order by in Verbindung mit Limit und nicht oder, eins von beiden nützt natürlich nichts. Um die letzte revision von anderen Spalten zu bekommen ist dein WHERE Problem.

Re: MYSQL: max() problem

Verfasst: 25.11.2008, 16:29
von bond
Vor der Abfrage weißt du doch schon, welches Thema (toc_id) dich interessiert? Also fragst du einfach ab, was in der DB zu dem Thema da ist, sortierst es absteigend und nimmst das erste Ergebnis

Code: Alles auswählen

SELECT * FROM qh_helptext WHERE toc_id='{$toc_id}' ORDER BY id DESC LIMIT 1
{$toc_id} musst du mit der gewünschten Variable ersetzen.

Re: MYSQL: max() problem

Verfasst: 26.11.2008, 04:42
von nerd
ich brauche aber an einer anderen stelle die jeweils letzte letzte revision zu allen vorhandenen toc-id's (deswegen kann ich a nicht direkt mit "order by" oder "limit" rangehen, ausser ich setze das in meiner unterabfrage ein) - das ist dann meine aktuelle version der gesammten thematik. innerhalb der einzelnen seiten soll dann aber ein link sein "zeige rev. 1 vom 1.nov; zeige rev.2 vom 5. nov ..." etc.
so aehnlich wie das prinzip bei wikipedia: zuerst landet man auf der aktuellsten seite, aber oben gibts noch einen link "changelog" wo man zu frueheren versionen der selben seite kommt.
keine sorge, bekomme das schon hin ab hier. werde mir einen view anlegen welcher die letzte version zeigt und dann darueber einen join auf meinen table of contents machen.

Re: MYSQL: max() problem

Verfasst: 26.11.2008, 07:36
von DanielS
nerd hat geschrieben:...werde mir einen view anlegen welcher die letzte version zeigt und dann darueber einen join auf meinen table of contents machen.
Warum nicht einfach den Ansatz von net(t)worker verwenden?