2017-05-15 8 views
-1

Ich habe drei Tabellen mit einer ziemlich seltsamen Beziehung miteinander, und ich versuche, einige Daten aus ihnen zu bekommen, aber nicht herauszufinden, eine gute Möglichkeit, es zu tun. Die drei Tabellen sind im Wesentlichen:Auswählen des letzten Ergebnisses, wenn NULL (MySQL)

  • A eine Beziehung mit B.
  • B one-to-many hat eine some-zu-Eins-Beziehung mit C.

Die "A" -Tabelle hat Informationen über einen übergreifenden Umfang. Lassen Sie uns zum Zweck des Arguments sagen, dass Tabelle A eine Liste von Jobs enthält, die Sie oder etwas in der Art gehabt haben. A.Id ist der Primärschlüssel für A.

Die "B" -Tabelle enthält "Scheinwerfer" detalils über Dinge in Bezug auf die "A" -Tabelle. B.Id ist der Primärschlüssel für B, es hat eine B.Timestamp, um die Zeit anzugeben, zu der das Ereignis passierte, und es hat eine B.AId Spalte, um anzuzeigen, auf welches "A" es verweist.

Hier wird es kompliziert. Die "C" -Tabelle enthält Informationen über Dinge in Bezug auf einige Einträge in "B". Es hat zwei Spalten, im Wesentlichen C.Bid und C.Value.

A.Id B.Id C.Value (... and other columns, of course...) 
    1  1   12 
    1  2  NULL 
    1  3  NULL 
    1  4   13 
    1  5  NULL 
    2  6   91 
    2  7   12 
    2  8  NULL 
    2  9  NULL 
    2  10  NULL 
    3  11   92 
    3  12   91 
    3  13  NULL 
    3  14   92 

etc ...

Jetzt habe ich die Zeitstempel in dem „B“ Tisch bekommt, die mir helfen können erhalten: Wenn Sie SELECT * FROM A JOIN B ON B.AId = A.ID LEFT JOIN C ON C.Bid = B.Id sind, werden Sie mit so etwas wie diesem gelassen werden ein Verständnis, wenn die C.Value ändert, aber was, wenn ich den erwarteten Wert von C.Value sehen wollte, wenn B.Id = 10? Basierend auf den Daten dort, ich wissen, dass die richtige Antwort immer noch C.Value = 12 ist, da es nicht geändert hat, aber ich habe keine gute Möglichkeit, es zu visualisieren.

Also, was ich zu fragen, im Grunde ist, helfen, eine Abfrage zu erstellen, die mir A.Id, B.Id und die letzte Nicht-Null-C.Value mit B.Timestamp als Kriterien zeigen können. Die IDs können manchmal nicht in Ordnung sein, aber der Timestamp ist immer korrekt.

Danke!

+0

Erstellen Sie eine Inline-Ansicht, die B mit C verbindet und nur den Wert für max (timeStamp) und AID von B zurückgibt, wobei C.Value nicht null ist. Dann verbinden Sie sich mit Ihrem Basissatz in Tabelle B. Dies würde Ihnen dann nur A/B-Datensätze geben, die einen maximalen Zeitstempel haben, wobei der C-Wert nicht null ist. – xQbert

+0

Sagen wir, ich habe eine Antwort gegeben; es hätte am Anfang einige Bits, einige Bits in der Mitte und ein Endbit. Siehe https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql-query – Strawberry

+0

@xQbert ... und dann passiert Magie und plötzlich sehe ich die fehlenden 'C.Value' Felder irgendwie? ;-) –

Antwort

0

Ich gebe zu, ich verstehe die Frage noch nicht vollständig. Beispieldaten mit einem erwarteten Ergebnis würden wirklich helfen. Especialyl wobei A 3 B ID Aufzeichnungen hat und nur die früheste oder zweite früheste Aufzeichnung wird auf einen Wert in C.

Zusammenhang
SELECT A.ID, B.ID, C.Value 
FROM A 
INNER JOIN B 
on A.ID = B.AID 
INNER JOIN (SELECT AID, max(timestamp) mTimeStamp 
      FROM B 
      INNER JOIN C 
       on B.ID = C.BID 
      WHERE C.Value is not null 
      GROUP BY AID) Z 
on B.AID = Z.AID 
and B.TimeStamp = Z.mTimeStamp 
LEFT JOIN C 
on C.BID = B.ID 

So kehren wir alle Werte von A.ID, B.ID, C.value von a begrenztes Set.

Durch Verbinden mit der Inline-Ansicht 'Z' begrenzen wir B-Datensätze auf diejenigen, deren MAX (Zeitstempel) für jeden AID-Wert einen Nicht-Null-C-Wert hat. Dadurch werden alle A.ID und B.IDs eliminiert, die keinen C-Wert haben; und wer sind nicht die max.

Dies setzt voraus, dass, wenn Sie eine Situation haben, wo ich eine A.ID mit mehreren B IDs habe sagen 1,2,3 und nur 2 hat einen Wert. dann wollen Sie, dass Datensatz (2) nicht 3.

Ich nehme an, wir könnten eine vorhandene Abfrage verwenden, um zu sehen, ob das fragliche BID in der C-Tabelle mit einem Wert vorhanden ist, aber da Sie den Wert zurückgegeben möchten, ein Join mehr gemacht Sinn für mich.

Verwandte Themen