Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

MYSQL: max() problem

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
nerd
PostRank 10
PostRank 10
Beiträge: 4023
Registriert: 15.02.2005, 04:02

Beitrag von nerd » 23.11.2008, 23:21

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...

Anzeige von ABAKUS

von Anzeige von ABAKUS »

Content Erstellung von ABAKUS Internet Marketing
Ihre Vorteile:
  • einzigartige Texte
  • suchmaschinenoptimierte Inhalte
  • eine sinnvolle Content-Strategie
  • Beratung und Umsetzung
Jetzt anfragen: 0511 / 300325-0

Anonymous

Beitrag von Anonymous » 23.11.2008, 23:50

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....

bloddy newbie
PostRank 4
PostRank 4
Beiträge: 171
Registriert: 18.05.2006, 20:15

Beitrag von bloddy newbie » 24.11.2008, 07:50

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

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


marc75
PostRank 9
PostRank 9
Beiträge: 1916
Registriert: 06.10.2004, 09:36

Beitrag von marc75 » 24.11.2008, 11:11

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

Anonymous

Beitrag von Anonymous » 24.11.2008, 13:40

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

nerd
PostRank 10
PostRank 10
Beiträge: 4023
Registriert: 15.02.2005, 04:02

Beitrag von nerd » 24.11.2008, 21:59

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.

Anonymous

Beitrag von Anonymous » 24.11.2008, 22:59

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....

marc75
PostRank 9
PostRank 9
Beiträge: 1916
Registriert: 06.10.2004, 09:36

Beitrag von marc75 » 25.11.2008, 08:51

"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.

bond
PostRank 4
PostRank 4
Beiträge: 186
Registriert: 20.06.2008, 00:41

Beitrag von bond » 25.11.2008, 16:29

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.

nerd
PostRank 10
PostRank 10
Beiträge: 4023
Registriert: 15.02.2005, 04:02

Beitrag von nerd » 26.11.2008, 04:42

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.

DanielS
PostRank 9
PostRank 9
Beiträge: 1179
Registriert: 03.08.2008, 08:45

Beitrag von DanielS » 26.11.2008, 07:36

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?

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag