Letzte Einträge ausgeben

leuktra

Mitglied
Hallo zusammen,

ich habe zwei Tabellen. Zwischen tbl_schueler (klassen_key) und tbl_klassen (id) besteht eine
Beziehung.

tbl_klassen
--------------
id | klassen
--------------
1 | 7. Klasse
2 | 8. Klasse
3 | 9. Klasse
--------------

tbl_schueler
---------------------------------------------
id | klassen_key | text | eintrag
---------------------------------------------
1 | 2 | bla_a | 2007-02-13 15:47:22
2 | 1 | bla_b | 2006-12-22 11:23:46
3 | 2 | bla_c | 2007-05-09 10:17:02
4 | 3 | bla_d | 2007-04-12 14:05:17
usw.
---------------------------------------------

Nun würde ich mir gerne jeweils den letzen Eintrag
aus tbl_schueler (bezogen auf klassen_key) anzeigen lassen:

bla_c - 09.05.07 - 10:17:02
bla_d - 12.04.07 - 14:05:17
bla_b - 22.12.06 - 11:23:46

Leider bekomme ich mit meiner Abfrage nicht den Eintrag vom
2007-05-09 10:17:02 (id 3) sondern immer den Eintrag
vom 2007-02-13 15:47:22 (id 1) angezeigt, obwohl dieser älter ist!

PHP:
$query  = "SELECT tbl_klassen.id, tbl_klassen.klassen, tbl_schueler.klassen_key tbl_schueler.eintrag, DATE_FORMAT(eintrag, '%d.%m.%y - %H:%i:%s') AS eintrag_new
FROM tbl_schueler LEFT JOIN tbl_schueler ON (tbl_klassen.id = tbl_schueler.klassen_key)
GROUP BY tbl_klassen.klassen HAVING CURDATE() >= tbl_schueler.eintrag ORDER BY tbl_klassen.klassen ASC";

Was mache ich falsch?
 
Hallo,

versuchs mal so:
Code:
SELECT tbl_klassen.id, tbl_klassen.klassen, MAX(tbl_schueler.eintrag) AS eintrag_new
FROM tbl_schueler INNER JOIN
                      tbl_klassen ON tbl_schueler.klassen_key = tbl_klassen.id
GROUP BY tbl_klassen.klassen, tbl_klassen.id
ORDER BY tbl_klassen.klassen
Da sollte dies rauskommen:
id klassen eintrag_new
1 7. Klasse 22.01.2006
2 8. Klasse 09.05.2007
3 9. Klasse 12.04.2007
 
Hi Bernd,

danke für Deine schnelle Rückantwort. :)

Drei Sachen habe ich nicht hinbekommen bzw. funktionieren nicht richtig:

1.) Es wird korrekt das Datum des letzten aktuellen Eintrags ausgegeben, jedoch nicht der
entsprechende Text dazu, sondern der "alte Text" dazu :confused:

2.) Ich habe es leider auch nicht hinbekommen, daß Datum so formatiert auszugeben:
tt.mm.jj - hh:mm:ss

3.) Auch die Ausgabe (Sortierung) nach dem Datum absteigend, bekomme ich nicht hin :confused:

Hilfe wäre nett
 
Hallo leuktra,

zu 1.: dein aktueller SQL wäre hilfreich.
zu 2.: Kann ich dir nicht helfen, da du wohl MySQL benutzt und dies bei MSSQL anders ist.
zu 3.: Ein ORDER BY MAX(tbl_schueler.eintrag) sollte dies tun.
 
Hi Bernd,

prima, daß Du geantwortet hast! :)

zu 1.)
PHP:
SELECT 
tbl_klassen.id, 
tbl_klassen.klassen,
tbl_schueler.text,  

MAX(tbl_schueler.eintrag) AS eintrag_neu

FROM tbl_schueler 

INNER JOIN

tbl_klassen ON tbl_schueler.klassen_key = tbl_klassen.id

GROUP BY tbl_klassen.klassen, tbl_klassen.id

ORDER BY eintrag_neu DESC

zu 2.) Ja, ich benutze Mysql.:)

zu 3.) Habe ich schon gelöst.:)
 
Hallo,

zu 2.: Versuch mal DATE_FORMAT(eintrag_neu, '%d.%m.%Y')

zu 1.: Schau dir das mal an:
Code:
SELECT     tbl_schueler1.eintrag_new, tbl_schueler1.klassen_key, tbl_schueler1.text, tbl_klassen.Klassen
FROM         (SELECT     MAX(eintrag) AS eintrag_new, klassen_key, MAX(text) AS text
                       FROM          tbl_schueler
                       GROUP BY klassen_key) AS tbl_schueler1 INNER JOIN
                      tbl_klassen ON tbl_schueler1.klassen_key = tbl_klassen.id
 
Hi Bernd,

danke für Deine Rückantwort! Auf diese komplexe Abfrage wäre ich nie gekommen :(

Leider bin ich erst an diesem WE dazu gekommen, alles auszuprobieren. Es taucht dabei noch folgendes Problem auf:
Ich habe z.B. zwei Eintrage zu einem "klassen_key". Wenn ich im aktuellen (letzten Eintrag) z.B. eine Korrektur im Feld "text" vornehme, dann wird mir plötzlich der erste (alte Eintrag) als "Aktueller" Eintrag ausgegeben; obwohl ich gar keine Änderung beim Datum (Feld "eintrag") des letzten Eintrags vorgenommen habe!
Das verstehe ich nicht! Wie kann das passieren? Das Feld "text" hat doch gar nichts mit dem Feld "eintrag" zu tun!
 
Hallo,

sorry, war noch ein kleiner Fehler drin, der durch deine Änderung erst in Erscheinung tritt. Leider wird es dadurch noch etwas komlpexer.

Code:
SELECT     tbl_schueler1.eintrag_new, tbl_schueler1.klassen_key, tbl_schueler1.text, tbl_klassen.Klassen
FROM         (SELECT     tbl_schueler_1.eintrag_new, tbl_schueler.klassen_key, tbl_schueler.text
                       FROM          tbl_schueler INNER JOIN
                                                  (SELECT     MAX(eintrag) AS eintrag_new, klassen_key
                                                    FROM          tbl_schueler
                                                    GROUP BY klassen_key) tbl_schueler_1 ON tbl_schueler.eintrag = tbl_schueler_1.eintrag_new) tbl_schueler1 INNER JOIN
                      tbl_klassen ON tbl_schueler1.klassen_key = tbl_klassen.id

So ist es korrekt.
 
Hallo Bernd!

Super! Spitzenmäßig! Cool! Das funktioniert perfekt! Danke für Deine Hilfe

Ich hätte noch eine Frage bzw. Idee: gern würde ich in der DB-tbl ein Feld "geaendert" einfügen - also so:

tbl_schueler
----------------------------------------------------------------------------------
id | klassen_key | text | eintrag | geaendert
----------------------------------------------------------------------------------
1 | 2 | bla_a | 2007-02-13 15:47:22 | 2007-02-14 05:07:12
2 | 1 | bla_b | 2006-12-22 11:23:46 | 0000-00-00 00:00:00
3 | 2 | bla_c | 2007-05-09 10:17:02 | 0000-00-00 00:00:00
4 | 3 | bla_d | 2007-04-12 14:05:17 | 2007-02-15 18:06:32
usw.
----------------------------------------------------------------------------------

und bei der Abfrage gleichzeitig auch das Änderungsdatum mit einbeziehen, um mir jeweils den letzen Eintrag aus tbl_schueler (bezogen auf klassen_key) anzeigen zu lassen. Das ist sehr kompliziert, oder?

Gruß
 
Hallo leuktra,

wenn du das so meinst?
Code:
SELECT     tbl_schueler1.eintrag_new, tbl_schueler1.klassen_key, tbl_schueler1.text, tbl_klassen.Klassen, tbl_schueler1.geaendert
FROM         (SELECT     tbl_schueler_1.eintrag_new, tbl_schueler.klassen_key, tbl_schueler.text, tbl_schueler.geaendert
                       FROM          tbl_schueler INNER JOIN
                                                  (SELECT     MAX(eintrag) AS eintrag_new, klassen_key
                                                    FROM          tbl_schueler
                                                    GROUP BY klassen_key) tbl_schueler_1 ON tbl_schueler.eintrag = tbl_schueler_1.eintrag_new) tbl_schueler1 INNER JOIN
                      tbl_klassen ON tbl_schueler1.klassen_key = tbl_klassen.id
Das ist sehr kompliziert, oder?
Nein, wenn man sich länger und/oder intensiv mit SQL beschäftigt, dann nicht mehr.
 
Zurück