[MySQL] Problem mit Gruppierung und Auflistung

Admi

Erfahrenes Mitglied
Hallo und gleich zu meinem Problem.

Ich habe einen Query aus 3 Tabellen gebastelt, der mir alle Datensätze (eine Migration aus Access, die ich verwenden muss) ausgibt. Allerdings möchte ich nur die jeweils letzten Datensätze davon haben.

Tabelle

Band | Name | Datum
1 | xxx | xx.xx.xxxx
1 | yyy |
1 | zzz |
2 ...
2
4
4
4
4
5

Jetzt möchte ich von der Spalte Band nur jeweils den letzten Datensatz (vom Datum her gesehen). Bei ACCESS gab es da die Funktion LAST, die ich bei MySQL leider nicht finde. Gibt es einen Workarround für dieses Problem. Weiß jemand Rat.

Mit Group und Order by hab ich schon alles möglich versucht. Limit limitiert leider den ganzen Select.

Das sich der Code auf meinem Laptop auf Arbeit befindet, kann ich ihn heute erstmal leider hier nicht posten.
 
Hallo,

du sprichst von den „jeweils letzten“ Datensätzen – aber worauf bezieht sich dieses „jeweils“? Gruppierst du nach Band oder nach Name? Oder möchtest du nur den Wert der Spalte Band für die Zeile mit dem höchsten Datum-Wert?

Grüße,
Matthias
 
Ich versuchs mal näher zu beschreiben.

Es gibt diverse Buchbände, deren Registrierungsdatum und Verweilort in eine Datenbanktabelle eingetragen wurde (einstmals Access nun migriert auf SQL und daher muss ich mit alten Fehlern leben bei ca. 400.000 Datensätzen in 5 Tabellen) Daher auch zwangsweise ein Query über 3 Tabellen.

Ich gruppiere derzeit nach Band und sortiere ebenso nach Band aufsteigend. Dabei werden mir von Band 1-x alle Einträge angezeigt
(zB für Band 1, 3 Einträge, wo aufgezeigt wird, von wo nach wo das Buch gegangen ist.) Mit meinem jetzigen Query erhalte ich aber ohne Group by alle Datensätze und mit Group by die jeweils ersten Datensätze zu jedem Band (eine Standardeinstellung von MySQL?)

Ich möchte nur den jeweils zeitlich letzten Datensatz (Also den Wert, wo das Band x derzeit örtlich zu finden ist) von jedem Band.
Wenn es z.B. zu Band 1, 3 Datensätze gibt, dann soll mir aber nur der zeitlich letzte von diesen 3 Einträgen angezeigt werden und nicht wie derzeit der erste (mit group by) oder jeder der 3 (ohne group by)

Morgen könnte ich das ganze auch hier bebildern und den Code reinstellen, dann sieht man das vielleicht besser, als ich in der Lage bin, den Sachverhalt zu erklären.
 
Hallo,

welche MySQL-Version verwendest du denn? Ich vermute, dass hier eine Lösung mit Subselect oder alternativ einem Selfjoin möglich ist.

Bei nicht gruppierten Feldern kann übrigens keine Voraussage darüber gemacht werden, aus welcher Zeile sie ihre Werte beziehen. Womöglich ist das meist die Zeile, die physikalisch früher in der Tabelle steht – muss aber auch nicht zwingend der Fall sein.

Grüße,
Matthias
 
Derzeit nur XAMPP, also die halbwegs aktuelle Version mit:

PHP 5.0.4
MySQL 4.1.13

An einen Subselect dachte ich auch schon, wusste aber mangels Erfahrung nicht, wie sich das umsetzen lässt. Vielleicht hilft ja der Code morgen weiter?
 
Hallo,

mit Subselect:
SQL:
SELECT
 `outer`.*
FROM
  `tabelle` `outer`
WHERE `Datum` = (
  SELECT MAX(`Datum`)
  FROM `tabelle` `inner`
  WHERE `inner`.`Band` = `outer`.`Band`
)

Mit Selfjoin:

SQL:
SELECT
  `l`.*
FROM
  `tabelle` `l`
LEFT JOIN `tabelle`  `r` ON
  (`r`.`Band` = `l`.`Band` AND
   `r`.`Datum` > `l`.`Datum`)
WHERE `r`.`Datum` IS NULL

Grüße,
Matthias
 
Die Subselectlösung hatte ich sogar schon mit Ausnahme der Wherebedingung darin. Danke, jetzt hab ichs anhand der Syntax hinbekommen :D
 

Neue Beiträge

Zurück