478 Stimmen

SQL Join: Auswählen der letzten Datensätze in einer eins-zu-viele Beziehung

Angenommen, ich habe eine Tabelle mit Kunden und eine Tabelle mit Einkäufen. Jeder Einkauf gehört zu einem Kunden. Ich möchte eine Liste aller Kunden zusammen mit ihrem letzten Kauf in einer SELECT-Anweisung erhalten. Was ist die beste Vorgehensweise? Irgendwelche Ratschläge zum Erstellen von Indizes?

Bitte verwenden Sie diese Tabellen-/Spaltennamen in Ihrer Antwort:

  • Kunde: id, name
  • Kauf: id, customer_id, item_id, date

Und in komplizierteren Situationen, wäre es (leistungsbedingt) vorteilhaft, die Datenbank zu denormalisieren, indem man den letzten Kauf in die Kundentabelle aufnimmt?

Wenn die (Kauf-) id garantiert nach Datum sortiert ist, können die Anweisungen durch die Verwendung von etwas wie LIMIT 1 vereinfacht werden?

2 Stimmen

Ja, es könnte sich lohnen, zu denormalisieren (wenn es die Leistung erheblich verbessert, was Sie nur durch Testen beider Versionen herausfinden können). Aber die Nachteile der Denormalisierung sind normalerweise das Vermeiden wert.

3 Stimmen

3voto

Gaurav Patil Punkte 704

Tabellen :

Kunde => id, name
Kauf => id, kunden_id, artikel_id, datum

Anfrage :

SELECT K.id, K.name, A.id, A.datum
  FROM kunde AS K
  LEFT JOIN kauf AS A ON 
    (
      A.kunden_id = K.id 
      AND A.id IN (
        SELECT MAX(AA.id) FROM kauf AS AA GROUP BY AA.kunden_id
      )
    )

Sie können auch einige Bedingungen in die Subselect-Anfrage angeben

2voto

Milad Shahbazi Punkte 124

Bitte versuchen Sie dies,

SELECT 
c.Id,
c.name,
(SELECT pi.price FROM purchase pi WHERE pi.Id = MAX(p.Id)) AS [LastPurchasePrice]
FROM customer c INNER JOIN purchase p 
ON c.Id = p.customerId 
GROUP BY c.Id,c.name;

1voto

Gary Bao 鲍昱彤 Punkte 1946

Ohne zuerst in den Code einzusteigen, geht die Logik/der Algorithmus wie folgt vor:

  1. Gehen Sie zur Transaktion Tabelle mit mehreren Datensätzen für denselben Klienten.

  2. Wählen Sie Datensätze von KundenID und dem neuesten Datum der Aktivität des Kunden unter Verwendung von group by clientID und max(transactionDate)

       select clientID, max(transactionDate) as latestDate 
       from transaction 
       group by clientID
  3. inner join die Transaktion Tabelle mit dem Ergebnis aus Schritt 2, dann haben Sie die vollständigen Datensätze der Transaktion Tabelle nur mit dem neuesten Datensatz jedes Kunden.

       select * from 
       transaction t 
       inner join (
         select clientID, max(transactionDate) as latestDate
         from transaction 
         group by clientID) d 
       on t.clientID = d.clientID and t.transactionDate = d.latestDate) 
  4. Sie können das Ergebnis aus Schritt 3 verwenden, um mit einer beliebigen Tabelle zu verknüpfen und unterschiedliche Ergebnisse zu erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X