Vinzenz Mai: Standardaufgabe: korreliertes Subselect

Beitrag lesen

Hallo Gerry,

Ich kriege aber nicht den aktuellen, neusten Datensatz, sondern irgendeiner der per Zufall da in der GROUP BY ausselektiert wurde :-S (Keine Ahnung wie ich das beeinflussen soll.)

Gar nicht, das kannst Du nicht beeinflussen. Das Ergebnis ist zufällig.
Jedes andere DBMS (Datenbankmanagementsystem) als MySQL, das ich kenne,
gibt Dir sowieso kein Ergebnis, sondern eine Fehlermeldung zurück.

Wie kann ich also, dieses MAXDATE abfragen; Dass somit die Gruppierung GENAU den Datensatz nimmt, wo dieses MAXDATE dabei ist?!

Mit einem korrelierten Subselect.

SELECT MAX(IssueDate) AS maxda, tblCustomer.Id AS CustomerId, Product, Version FROM tblProduct LEFT JOIN tblCustomer ON Fk_CustomerId = tblCustomer.Id WHERE 1 GROUP BY CustomerId, Product, Version

Möchtest Du also das letzte Ausgabedatum je Produkt und Kunde haben?

  
SELECT                        -- Nimm  
    p.IssueDate,              -- das Ausgabedatum  
    c.Id AS CustomerId,       -- die KundenID  
    p.Product,                -- das Produkt  
    p.Version,                -- die Version  
FROM tblProduct p             -- aus der Tabelle Produkte  
/*  
   Wenn Du eh' nach Kunden gruppierst, warum nimmst Du dann einen  
   LEFT JOIN. Ich würde eher einen INNER JOIN erwarten.  
   Oder interessiert dich auch die letzte Ausgabe eines Produkts,  
   zu dem _kein_ Kunde eingetragen wurde?  
*/  
LEFT JOIN tblCustomer c          -- und der Tabelle Kunden  
ON p.Fk_CustomerId = c.Id        -- die über diese beiden Spalten verknüpft sind  
WHERE p.IssueDate = (            -- wobei jeweils nur das  
WHERE zeit = (  
    SELECT MAX(p2.IssueDate)     -- das neueste Datum  
    FROM tblProduct p2  
    WHERE p.Product = p2.Product -- je Produkt  
        AND p.Fk_CustomerId = p2.Fk_CustomerId  -- und Kunde interessiert.  
)

ganz analog zu meinem bereits verlinkten Beispiel im Archiv.

Freundliche Grüße

Vinzenz