MySql在结果集之前和之后的第一个结果

时间:2014-04-11 06:42:50

标签: mysql ifnull multiple-resultsets

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

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

enter image description here

现在到目前为止一切顺利,我糟糕的查询有效。也就是说,如果我想获得一个实体的测量值。但是现在我想在一个查询中获得关于性能的一组实体的结果。更好地查询一次以获得来自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
哦,鹿,我在这里发布了一个看起来很糟糕的问题。希望我清楚自己。 谢谢!

1 个答案:

答案 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