Vinzenz Mai: max(date) über mehrere Tabellen

Beitrag lesen

Hallo,

Tabelle A

Id Name
1 aa
2 bb
3 cc

  

> ~~~perl

Tabelle B  

> Id Datum  
> 1  2010-02-21 03:25:31  
> 1  2010-02-22 04:25:35  
> 2  2010-02-21 01:23:31  
> 2  2010-02-23 04:24:31

Nun will ich eine Tabelle die mir von jeder ID in Tabelle A des neueste Datum aus Tabelle B ausgibt und dazu noch die Differenz an Tagen zu heute.
Ergebnis sollte sein:

ID Name Datum Datediff

1 aa 2010-02-22 04:25:3 3
2 bb 2010-02-23 04:24:3 2

  
schön. Selten beschreibt einer so schön, was er hat und was er bekommen möchte und warum.  
  

> Meine Versuch:  
> ~~~sql

SELECT A.id,DATEDIFF("2010-02-25",max(B.date)) FROM A, B  
  
-- Warum keine wundervollen, schönen und verständlichen INNER JOINS?  
  

> WHERE A.id = B.id  
> AND B.date = (SELECT max(B.date) FROM B)

Easy. Du suchst eine korrelierte Unterabfrage.

Das kann nicht funktionieren, da max(B.date) im subquery ja nicht bei allen gleich ist.

ja eben. Korreliere sie. Die id von innen muss mit der von außen übereinstimmen.

Ergibt:

SELECT  
    A.id,  
    -- Du möchtest die Query nicht jeden Tag neu schreiben wollen  
    DATEDIFF([link:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_current-date@title=CURRENT_DATE(]), MAX(B1.date))  
FROM  
    A  
INNER JOIN  
    B AS B1 -- wir müssen zweimal auf B zugreifen, daher der Aliasname  
ON  
    A.id = B1.id  
-- Nun schränken wir die Datensätze ein  
WHERE  
    B1.date = (  
        SELECT  
            MAX(B2.date)  
        FROM  
            B B2    -- um den inneren Zugriff vom äußeren unterscheiden zu  
                    -- können,  
        WHERE  
                    -- und wir das Maximaldatum zu jeder ID benötigen  
                    -- Das ist die Korrelation.  
            B1.id = B2.id  
    )  

Freundliche Grüße

Vinzenz