我有这个糟糕的查询,我使用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
哦,鹿,我在这里发布了一个看起来很糟糕的问题。希望我清楚自己。
谢谢!
答案 0 :(得分:1)
在子查询中,应该在主查询中连接到CowID ... 您的查询应如下所示:
SELECT
*
FROM
`measurements` `m1`
WHERE
`m1`.`CowId` IN (23 , 22, 19, 18, 17, 16, 15, 20, 21, 14)
AND `m1`.`CellCount` >= 0
AND (`m1`.`Date` BETWEEN IFNULL((SELECT
MAX( `m2`.`Date`)
FROM
`measurements` `m2`
WHERE
`m2`.`CowId` = `m1`.`CowId`
AND `m2`.`Date` < '2014-03-28 00:00:00'),
'2014-03-28 00:00:00') AND IFNULL((SELECT
MIN( `m3`.`Date`)
FROM
`measurements` `m3`
WHERE
`m3`.`CowId` = `m1`.`CowId`
AND `m3`.`Date` > '2014-04-11 23:59:59'),
'2014-04-11 23:59:59'))
ORDER BY `m1`.`CowId` ASC ,`m1`.`Date` ASC