选择空值时的最新结果(MySQL)

选择空值时的最新结果(MySQL),mysql,Mysql,我有三个表,它们之间的关系非常奇怪,我试图从中获取一些数据,但没有找到一个好的方法。这三个表基本上是: A与B有一对多关系 B与C之间存在一对一的关系 “A”表包含关于总体范围的信息。为了便于讨论,让我们假设表A包含一个您曾经做过的工作或类似的事情的列表A.Id是A.Id的主键 “B”表包含与“A”表相关的“聚光灯”细节B.Id是B的主键,它有一个B.Timestamp指示事件发生的时间,它有一个B.AId列指示它返回到哪个“a” 这就是事情变得复杂的地方。“C”表包含与“B”中某些条目相关

我有三个表,它们之间的关系非常奇怪,我试图从中获取一些数据,但没有找到一个好的方法。这三个表基本上是:

  • A与B有一对多关系
  • B与C之间存在一对一的关系
“A”表包含关于总体范围的信息。为了便于讨论,让我们假设表A包含一个您曾经做过的工作或类似的事情的列表
A.Id
是A.Id的主键

“B”表包含与“A”表相关的“聚光灯”细节
B.Id
是B的主键,它有一个
B.Timestamp
指示事件发生的时间,它有一个
B.AId
列指示它返回到哪个“a”

这就是事情变得复杂的地方。“C”表包含与“B”中某些条目相关的信息。它有两列,基本上是
C.Bid
C.Value
。如果您要
从B.AId=A.ID上的JOIN B中选择*从C.Bid=B.ID上的JOIN C中选择*,您将得到如下结果:

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
,因为它没有改变,但我没有很好的方法来可视化它

因此,基本上,我所要求的是帮助构造一个查询,该查询可以使用
B.Timestamp
作为条件显示
a.Id、B.Id
和最近的非空
C.Value
。ID有时会出现问题,但时间戳总是正确的


谢谢

我承认我还没有完全理解这个问题。具有预期结果的示例数据将非常有用。特别是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记录限制为每个AID值的最大值(时间戳)为非空C值的记录。从而消除所有没有C值的A.ID和B.ID;谁不是最大的

这假设如果你有一个a.ID和多个B ID的情况,比如说1,2,3,只有2有一个值。那么你想要的是那张唱片(2)而不是3


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

创建一个将B连接到C的内联视图,并仅从B返回max(时间戳)和AID值,其中C.值不为null。然后将其连接回表B中的基集。这样将只提供具有最大时间戳(其中C值不为null)的A/B记录;它在开始时会有一些位,中间有一些位,还有一个结束位。见@xQbert。。。然后神奇的事情发生了,突然我看到了不知何故丢失的
C.Value
字段?;-)