Neuster Datensatz bei einem join

Nob

Mitglied
Hallo zusammen

Dieses Thema wurde schon oft behandelt - leider wurde ich nocht nicht ganz schlau daraus.

Ich habe folgende MySql (5.0.18) - Tabellen:
Code:
user                        notiz
========                    ================
Id | name                   id | fk_user    | datum | text
----------------            --------------------------------
1  | a                      1  | 1          | 1     | g
2  | b                      2  | 1          | 2     | h
                            3  | 2          | 1     | i

Mit welcher Abfrage bekomme ich folgendes Ergebnis?

ergebnis
==================================
user_id | user_name | datum | text
----------------------------------
1       | a         | 2     | h
2       | b         | 1     | i

Hat jemand einen Vorschlag, scheinbar scheint GROUP BY nicht die richtige Lösung zu sein?

Besten Dank
 
Hallo Nob,

GROUP BY ist schon der richtige Ansatz, aber das allein reicht noch nicht.

Versuchs mal so:
Code:
SELECT     user.Id, user.name, notiz.datum, notiz.text
FROM         user INNER JOIN
                      notiz ON user.Id = notiz.fk_user INNER JOIN
                          (SELECT     fk_user, MAX(datum) AS MaxDatum
                            FROM          notiz
                            GROUP BY fk_user) notiz_1 ON notiz.fk_user = notiz_1.fk_user AND notiz.datum = notiz_1.MaxDatum
Der SQL ist zwar so ok, aber unter MySQL musst du zumindest die reservierten Wörter noch maskieren bzw. solche (user, name, text usw.) garnicht erst benutzten.

Also besser so etwas:
Code:
SELECT     Tab_user.Id, Tab_user.Feld_name, Tab_notiz.Feld_datum, Tab_notiz.Feld_text
FROM         Tab_user INNER JOIN
                      Tab_notiz ON Tab_user.Id = Tab_notiz.fk_user INNER JOIN
                          (SELECT     fk_Tab_user, MAX(Feld_datum) AS MaxDatum
                            FROM          Tab_notiz
                            GROUP BY fk_Tab_user) Tab_notiz_1 ON Tab_notiz.fk_Tab_user = Tab_notiz_1.fk_user 
                                    AND Tab_notiz.Feld_datum = Tab_notiz_1.MaxDatum
 
  • Gefällt mir
Reaktionen: Nob
Hallo Bernd

Wooow! Super, besten Dank für die super Antwort!

Nur noch eine Frage, wenn ich viele Daten habe, ist es dann effizienter in meiner "user" - Tabelle die Id der neusten Notiz zu speichern?
Somit weiss ich genau welcher Datensatz ich von der "notiz" - Tabelle benötige, die Abfrage ist somit kleiner aber auch schneller?


Besten Dank
Nob
 
Hallo Nob,

Nur noch eine Frage, wenn ich viele Daten habe, ist es dann effizienter in meiner "user" - Tabelle die Id der neusten Notiz zu speichern?
Erstmal hast du dann redundante Informationen in deiner DB (fk_user in Notiz und fk_notiz in User) und deine Anwendung mit der du die DB pflegst muss dann in 2 Tabellen (zusätzlich ein Update in user) schreiben, also aufwendiger.

Somit weiss ich genau welcher Datensatz ich von der "notiz" - Tabelle benötige, die Abfrage ist somit kleiner aber auch schneller?
Bei stark wachsender Datenbank kommt sicher irgend wann der Moment in dem die dann kleinere Abfrage (brauchst ja dann keinen gruppierten SubSelect mehr) schneller ist.
Der lesende Zugriff wird dadurch schneller, aber der schreibende Zugriff langsamer.

Kann man so machen, ich würde es nicht so machen, da ich es auch DB-technisch (Normalisierung und so) nicht begründen kann.
 
Zuletzt bearbeitet:
Zurück