我有一个糟糕的查询,我使用 IFNULL 来确定我的结果集之前和之后是否有结果。结果集由一段时间决定,见 5 月 5 日至 5 月 10 日。这段时间在我的应用程序中可视化为折线图。我想要 5 月 5 日到 5 月 10 日之前和之后的第一个结果,如果有的话(因此使用 IFNULL),因为我希望 grahp 的行是连续的。如果在可视化时间段之前有结果,我需要开始从该点画线,与图形区域相交,尽管它不在屏幕上。
请参阅图像以获取视觉示例。第一个图不包括可视化周期之前和之后的测量值(框表示实际显示给用户的图形区域),第二个图确实与 Y 轴相交,因为在显示周期之前有一个测量值,并且一个之后。
现在到目前为止一切顺利,我糟糕的查询有效。也就是说,如果我只想获得一个实体的测量值。但是现在我想在一个查询中为一组实体获得这个结果,就性能而言。更好的查询一次从 200 个实体获取测量值,而不是每个实体查询 = 200 次。所以我想我将查询从 更改WHERE Entity.Id=1
为WHERE Entity.Id IN (1, 2, 3, 4)
。现在的问题是,包含图表之前和之后的测量值的时期是通用的,而不是按实体及其测量值进行评估。
下面是每个实体的查询(在我的特定情况下是一头牛)
SELECT
*
FROM
`measurements`
WHERE
`CowId` = 23 AND `CellCount` >= 0
AND (`Date` BETWEEN IFNULL((SELECT
MAX(`Date`)
FROM
`measurements`
WHERE
`CowId` = 23
AND `Date` < '2014-03-28 00:00:00'),
'2014-03-28 00:00:00') AND IFNULL((SELECT
MIN(`Date`)
FROM
`measurements`
WHERE
`CowId` = 23
AND `Date` > '2014-04-11 23:59:59'),
'2014-04-11 23:59:59'))
ORDER BY `CowId` ASC , `Date` ASC
这是我尝试在一个查询中查询所有奶牛及其测量值
SELECT
*
FROM
`measurements`
WHERE
`CowId` IN (23 , 22, 19, 18, 17, 16, 15, 20, 21, 14)
AND `CellCount` >= 0
AND (`Date` BETWEEN IFNULL((SELECT
MAX(`Date`)
FROM
`measurements`
WHERE
`CowId` IN (23 , 22, 19, 18, 17, 16, 15, 20, 21, 14)
AND `Date` < '2014-03-28 00:00:00'),
'2014-03-28 00:00:00') AND IFNULL((SELECT
MIN(`Date`)
FROM
`measurements`
WHERE
`CowId` IN (23 , 22, 19, 18, 17, 16, 15, 20, 21, 14)
AND `Date` > '2014-04-11 23:59:59'),
'2014-04-11 23:59:59'))
ORDER BY `CowId` ASC , `Date` ASC
哦,鹿,我在 SO 上发布了一个看起来多么糟糕的问题。希望我说清楚了。谢谢!