2017-05-15 11 views
-1

私はお互いにかなり奇妙な関係を持つ3つのテーブルを持っていますが、データを取得しようとしていますが、 3つのテーブルは、基本的に次のとおりNULL(MySQL)のときの最新の結果を選択

  • AはB.
  • Bと1対多の関係を有するC.

「A」テーブルといくつかの対1の関係を有しています最も重要なスコープに関する情報があります。議論のために、テーブルAにあなたが持っていた仕事のリストなどが入っているとしましょう。 A.IdがAの主キーです。

"B"テーブルには、 "A"テーブルに関連する事項に関する "スポットライト"デタリールが含まれています。 B.IdがBの主キーである場合、イベントが発生した時刻を示すB.Timestampがあり、それが参照する「A」を示すB.AIdの列があります。

これは物事が複雑になる場所です。 「C」テーブルには、の項目「B」に関連する情報が含まれています。本質的にはC.BidC.Valueの2つの列があります。あなたはSELECT * FROM A JOIN B ON B.AId = A.ID LEFT JOIN C ON C.Bid = B.Idした場合、あなたはこのようなものが残っているはずだ:

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 

等...今

、私は私が得るのを助けることができ、「B」テーブル内のタイムスタンプを持っていますC.Valueがいつ変更されたかを理解していますが、 = 10のときに期待値C.Valueが見たい場合はどうなりますか?その中のデータに基づいて、私はを知っています正しい答えはまだC.Value = 12なので変更されていないので、私はそれを可視化する良い方法がありません。

だから、何私が求めていることは、基本的には、基準としてB.Timestampを使用して私にA.Id, B.Id最新のnull以外のC.Valueを表示することができ、クエリを構築するための助けです。 IDは時々乱れることがありますが、タイムスタンプは常に正しいです。

ありがとうございます!

+0

BからCを結合するインラインビューを作成し、Bから最大値(timeStamp)とAID値のみを返します。ここで、C.Valueはnullではありません。これをテーブルBのベースセットに戻します。これにより、Cの値がヌルでない最大タイムスタンプを持つA/Bレコードだけが得られます。 – xQbert

+0

私が答えを出したとしましょう。それは最初にいくつかのビットを持ち、中間にいくつかのビットを持ち、終わりのビットを持っています。 https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-queryを参照してください。 – Strawberry

+0

@xQbert ...そして魔法が起こり、突然私は見逃した 'C.Value'フィールドを何とかしていますか? ;-) –

答えて

0

私はまだその質問を完全に理解していないことを認めます。期待される結果を持つサンプルデータが本当に役に立ちます。 Aは、だから我々からA.ID、B.ID、C.valueからすべての値を返す3つのBのIDのレコードを持っているだけ早いまたは第二の早い記録はC.

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 

の値に関係しているEspecialyl限定セット。

インラインビュー 'Z'に結合することにより、Bレコードは、各AID値のMAX(タイムスタンプ)がC以外の値を持つものに限定されます。それにより、C値を持たない全てのA.ID及びB.IDを排除する。そして最大の人ではない人。

これは、複数のB IDを持つA.IDを1,2,3とし、2つだけに値がある状況があると想定しています。そのレコード(2)が3でないことが必要です。 存在するクエリを使用して、問題のBIDが値付きのCテーブルに存在するかどうかを確認できます私に感覚。

関連する問題