2009-03-30 6 views
1

Ich habe die folgenden Tabellen innerhalb einer Datenbank, dass ich die Ergebnisse von Erhebungen speichern bin mit:MySQL - Fragen und Antworten aus mehreren Transaktionen Kombination

alt text

Jedes Mal, wenn ich in einem Geschäft mit jemandem sprechen (lies Shop), ich erstelle eine neue Transaktion mit einem Datum/Uhrzeit (tblTransaction.Created). Mit jeder Transaktion können viele Frageantworten verknüpft sein.

Mein Problem ist, dass 2 Transaktionen können beide unterschiedliche Antworten auf die gleiche Frage enthalten und ich versuche, eine SQL-Abfrage/Prozedur zu erstellen, nur die neuesten Fragen Antworten für einen bestimmten Speicher zurückgeben.

Hier ist ein Beispiel:

ich mit jemandem in einigen Geschäften Plc sprechen. und legen Sie am 01.01.2009 eine Transaktion an (Transaktions-ID 1). In dieser Transaktion frage ich die QuestionIDs 1 und 2. Dann am 10/01/09 spreche ich erneut, erstelle eine neue Transaktion (Transaktions-ID 2) und beantworte die Fragen 2 und 3.

Ich möchte in der Lage sein um die Liste der letzten Antworten anzuzeigen; Frage 1 aus der ersten Transaktion und Fragen 2 und 3 aus der zweiten Transaktion.

Antwort

0
SELECT 
    S.StoreID, 
    S.BranchName, 
    A.QuestionID, 
    T.Created, 
    A.* 
FROM 
    tblStore S 
INNER JOIN tblTransaction T ON 
    T.StoreID = S.StoreID 
INNER JOIN tblAnswer A ON 
    A.TransactionID = T.TransactionID AND 
    A.StoreID = S.StoreID 
WHERE NOT EXISTS 
      (
      SELECT 
       T2.StoreID, 
       A2.QuestionID, 
       T2.TransactionID, 
       T2.CreatedDate 
      FROM 
       tblTransaction T2 
      INNER JOIN tblAnswer A2 ON 
       A2.TransactionID = T2.TransactionID AND 
       A2.StoreID = T2.StoreID 
      WHERE 
       T2.StoreID = T.StoreID AND 
       A2.QuestionID = A.QuestionID AND 
       T2.CreatedDate > T.CreatedDate 
     ) 

Sie können dies auch tun, indem LEFT OUTER Joining die Unterabfrage auf den gleichen Kriterien wie in der WHERE-Klausel und sucht nach einem NULL-Wert in ihm oder Sie können die TransactionID aus der Unterabfrage verwenden, um einen MAX() entfernen auf CreatedDate und suchen Sie nach einer Übereinstimmung mit einem INNER JOIN.

Beachten Sie, dass dies möglicherweise nicht so funktioniert, wie Sie es erwarten, wenn Sie mehrere Transaktionen für dasselbe Geschäft mit demselben Erstellungsdatum haben. Möglicherweise müssen Sie dort zusätzliche Kriterien hinzufügen, die auf Ihren Geschäftsregeln für diese Situation basieren.

Verwandte Themen