NULL(MySQL)时选择最新结果

时间:2017-05-15 12:39:29

标签: mysql

我有三张桌子彼此之间有着相当奇怪的关系,我正试图从中获取一些数据,但没有想出一个好方法。这三个表基本上是:

  • A与B有一对多的关系。
  • B与C有一对一的关系。

“A”表包含有关总体范围的信息。为了论证,让我们说表A包含你已经拥有的工作列表或类似的东西。 A.Id是A的主键。

“B”表包含与“A”表有关的事项的“聚光灯”。 B.Id是B的主键,它有一个B.Timestamp来表示事件发生的时间,它有一个B.AId列来指示它引用的“A”。

这是事情变得复杂的地方。 “C”表包含与“B”中某些条目相关的信息。它有两列,主要是C.BidC.Value。如果你去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何时发生变化,但如果我想查看C.Value的预期值,该怎么办?当B.Id = 10时?基于那里的数据,我知道正确的答案仍然是C.Value = 12,因为它没有改变,但我没有很好的可视化方法。

所以,基本上,我要求的是帮助构建一个查询,可以显示A.Id, B.Id最近的非空 C.Value使用{ {1}}作为标准。 Ids有时会出现故障,但时间戳总是正确的。

谢谢!

1 个答案:

答案 0 :(得分:0)

我承认我还没有完全理解这个问题。具有预期结果的样本数据确实会有所帮助。 Especialyl其中A有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

因此,我们从有限集合中返回A.ID,B.ID,C.value中的所有值。

加入内联视图' Z'我们将B记录限制为那些具有非空C值的每个AID值的MAX(时间戳)。从而消除所有不具有C值的A.ID和B.ID;谁不是最大的。

这假设如果你有一个带有多个B ID的A.ID的情况说1,2,3且只有2有一个值。那么你想要那条记录(2)不是3。

我想我们可以使用一个存在的查询来查看有问题的BID是否存在于带有值的C表中,但是由于您希望返回的值对我更有意义。