MySQL-Abfrage: Maximalwert und mehr als ein Wert

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    MySQL-Abfrage: Maximalwert und mehr als ein Wert

    Hallo zusammen,

    ich habe bei einer MySQL-Abfrage ein Problem.
    Ich setze mit JOIN/LEFT JOIN einen längeren Datensatz zusammen.
    Das klappt soweit auch gut.
    Allerdings sind in der Tabelle logfile (l) pro bug-id (b.id) mehrere Einträge enthalten.
    Ich will aber nur den Neusten anzeigen (l.zeit).

    Das klappt mit einem MAX(l.zeit) insofern ganz gut, dass für dieses Feld der maximale Wert ausgegeben wird (das Feld beinhaltet den Timestamp der letzten Änderung eines Bugs).
    Jetzt kommen aber die Probleme:bei lt.name (da steht der Typ der letzten änderung drin - andere tabelle, verknüpft mit l) kommt aber NICHT der letzte Wert, sondern halt der Erste. Wie muss ich das machen, dass hier der Wert aus dem Datensatz von MAX(l.zeit) genommen wird? Müsste ich die Abfrage mit INNER JOIN machen?
    Problematisch wird es natürlich auch, sobald ich mehrere Bug-IDs abfragen will. Wenn ich das MAX setze, dann bekomme ich natürlich genau nur einen Datensatz raus von einer bug.id. Aber ich hab ja in der Regel mehrere (beispielhaft in der Abfrage als IN (1,2,3) dargestellt. Ich brauche also für jede Bug-ID einen Datensatz.
    Wisst ihr was ich meine? Was mach ich hier falsch? :D

    SQL-Abfrage

    1. SELECT b.id, b.erstelltDatum, b.ueberschrift, b.faellig, f.name AS firma, bt.name AS bugtype, m.name AS mitarbeiter, bs.name AS status, ma.name AS abteilung, b.erledigtDatum, l.zeit AS letzte_aenderung, lt.name AS aenderungstyp
    2. FROM bug b
    3. JOIN firmen f ON f.ID = b.firmenID
    4. JOIN bug_typ bt ON bt.id = b.typID
    5. JOIN mitarbeiter m ON m.id = b.zugewiesenMitarbeiterID
    6. JOIN bug_status bs ON bs.id = b.statusID
    7. JOIN logfile l ON l.linkID = b.ID
    8. JOIN logfile_typ lt ON lt.ID = l.logfileTypID
    9. LEFT JOIN mitarbeiter_abteilung ma ON ma.id = b.zugewiesenAbteilungID
    10. WHERE b.id IN (1,2,3) ORDER by l.zeit DESC"
    Danke und Gruss,KlyX
    Chris' Weblog - Mein Blog rund um Vieles :D
    Hey,

    danke für die Info.
    Ja, das ist erstmal das Problem, dass ich nicht alle Werte der aggregierten Abfrage ge-GROUPt habe.
    Leider löst dies das Problem nicht.
    Der Haken liegt im Endeffekt in der Tatsache, dass ich versuche, mehrere Dimensionen in eine flache Abfrage zu packen. Das geht halt ned ;)
    Ich muss eigentlich für logfile und logfile_type ein SELECT im INNER JOIN einbauen.
    Das geht dann auch, ist aber derart ineffizient (die logfile hat 4 Millionen Einträge), dass die Abfrage in ein Timeout rennt ;)

    Werde das jetzt so lösen, dass ich die Abfragen gesondert mache, mit Arrays arbeite und das im Programm zusammenbasteln werde.
    Danke trotzdem :)
    Chris' Weblog - Mein Blog rund um Vieles :D
    Hi,

    dein Problem ist ein ziemlich übliches Problem. Es gibt da mehre Ansätze, sogar ein paar ohne Join oder Subquery. Welche MySQL Version verwendest du denn?
    Bei 4 Millionen Datensätzen sollte ein Selfjoin eigentlich noch halbwegs schnell gehen.

    Hier mal das was bei MS SQL relativ schnell geht (ersetz damit dein logfile in 'JOIN logfile l ON l.linkID = b.ID'):

    SQL-Abfrage

    1. (SELECT l1.linkID, l1.logfileTypID
    2. FROM logs l1
    3. LEFT OUTER JOIN logs l2
    4. ON l1.LinkID = l2.LinkID AND l1.zeit < l2.zeit
    5. WHERE l2.LinkID IS NULL) l


    Vorrausetzung ist das es nicht 2 Einträge mit der exakt selben Zeit gibt !
    Das ist meine Signatur und sie wird wunderbar sein!
    Genau so was in der Art hatte ich heute zusammen mit nem Arbeitskollegen ausprobiert. Im Endeffekt gleiche Logik/Idee dahinter. Da passiert dann bei der Ausführung (über phpMyAdmin) nichts mehr ausser "Laden...".
    Und das bleibt für gefühlt ewig :D Klingt nicht sonderlich performant :D
    Chris' Weblog - Mein Blog rund um Vieles :D