# Letzte Einträge ausgeben



## leuktra (19. Juni 2007)

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!


```
$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?


----------



## Bernd1984 (19. Juni 2007)

Hallo,

versuchs mal so:

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


----------



## leuktra (20. Juni 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 

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 

Hilfe wäre nett


----------



## Bernd1984 (20. Juni 2007)

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.


----------



## leuktra (21. Juni 2007)

Hi Bernd,

prima, daß Du geantwortet hast! 

zu 1.) 
	
	
	



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


----------



## Bernd1984 (21. Juni 2007)

Hallo,

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

zu 1.: Schau dir das mal an:

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


----------



## leuktra (9. Juli 2007)

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!


----------



## Bernd1984 (9. Juli 2007)

Hallo,

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


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


----------



## leuktra (12. Juli 2007)

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ß


----------



## Bernd1984 (12. Juli 2007)

Hallo leuktra,

wenn du das so meinst?

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


----------



## leuktra (25. Oktober 2007)

Bernd1984 hat gesagt.:


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




Hallo Bernd!

es gibt folgendes Problem: Die Tabellen- und Spalten müssen mit korrekten mysql Aliase bezeichnet werden; ansonsten läuft das bei meinem Provider nicht! 

Nun habe ich das schon so oft probiert aber es gelingt mir leider nicht  

Wer kann mir helfen?

Danke!


----------

