2014-04-11 134 views
0

我有這個糟糕的查詢,我使用IFNULL來確定結果集之前是否有結果和結果。結果集由一段時間決定,見5月5日至10日。這段時間在我的應用程序中可視化爲線圖。我想要在5月5日至5月10日期間前後的第一個結果,如果有任何(因此使用IFNULL),因爲我希望grahp的行是連續的。如果在可視化時間段之前出現結果,我需要從該點開始繪製線,與圖形區域相交,儘管它不在屏幕上。結果集之前和之後的MySql第一個結果

查看圖片以查看可視化示例。第一個圖形不包括可視化時間段之前和之後的測量結果(框表示實際顯示給用戶的圖形的區域),並且第二個圖形確實與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 

哦鹿,這是我在SO上發佈的一個可怕的問題。希望我明確自己。 謝謝!

回答

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 
+0

Wowwie!複製粘貼,它的工作。我現在沒有可以與這樣的查詢相關聯。非常感謝您的洞察力,特別是爲了使這個查詢工作的努力。你爲我節省了頭痛和我的一天! –

+0

祝您有美好的一天! –