0

我有一个糟糕的查询,我使用 IFNULL 来确定我的结果集之前和之后是否有结果。结果集由一段时间决定,见 5 月 5 日至 5 月 10 日。这段时间在我的应用程序中可视化为折线图。我想要 5 月 5 日到 5 月 10 日之前和之后的第一个结果,如果有的话(因此使用 IFNULL),因为我希望 grahp 的行是连续的。如果在可视化时间段之前有结果,我需要开始从该点画线,与图形区域相交,尽管它不在屏幕上。

请参阅图像以获取视觉示例。第一个图不包括可视化周期之前和之后的测量值(框表示实际显示给用户的图形区域),第二个图确实与 Y 轴相交,因为在显示周期之前有一个测量值,并且一个之后。

在此处输入图像描述

现在到目前为止一切顺利,我糟糕的查询有效。也就是说,如果我只想获得一个实体的测量值。但是现在我想在一个查询中为一组实体获得这个结果,就性能而言。更好的查询一次从 200 个实体获取测量值,而不是每个实体查询 = 200 次。所以我想我将查询从 更改WHERE Entity.Id=1WHERE 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 上发布了一个看起来多么糟糕的问题。希望我说清楚了。谢谢!

4

1 回答 1

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
于 2014-04-11T06:58:24.040 回答