2011-07-29 51 views
0

我有兩個查詢返回不同的結果,當我期望他們返回相同的結果。MySQL`HAVING`問題

第一個查詢返回正確的結果。 第二個返回結果,但它不正確。

這是爲什麼,我該如何解決第二條語句,以便它返回相同的結果?我必須在本聲明中使用HAVING條款。

1.

SELECT 
     CAST(CONCAT(DATE(`mytable`.`starttime`),' ',HOUR(`mytable`.`starttime`),':',LPAD(60*(MINUTE(`mytable`.`starttime`) DIV 60),2,'0'),':00') AS DATETIME) AS `date`, 
     `mytable`.`id` 
    FROM 
     `mytable` 
    WHERE 
     `mytable`.`starttime`>='2011-07-01 00:00:00' 
     AND `mytable`.`starttime`<='2011-07-01 23:59:59' 
     AND `id` BETWEEN 1 AND 100 
    GROUP BY 
     `mytable`.`id` 

2.

SELECT 
     CAST(CONCAT(DATE(`mytable`.`starttime`),' ',HOUR(`mytable`.`starttime`),':',LPAD(60*(MINUTE(`mytable`.`starttime`) DIV 60),2,'0'),':00') AS DATETIME) AS `date`, 
     `mytable`.`id` 
     FROM 
     `mytable` 
    WHERE 
     `id` BETWEEN 1 AND 100 
    GROUP BY 
     `mytable`.`id` 
    HAVING `date` IN ('2011-07-01 00:00:00', '2011-07-01 01:00:00', '2011-07-01 02:00:00', '2011-07-01 03:00:00', '2011-07-01 04:00:00', '2011-07-01 05:00:00', '2011-07-01 06:00:00', '2011-07-01 07:00:00', '2011-07-01 08:00:00', '2011-07-01 09:00:00', '2011-07-01 10:00:00', '2011-07-01 11:00:00', '2011-07-01 12:00:00', '2011-07-01 13:00:00', '2011-07-01 14:00:00', '2011-07-01 15:00:00', '2011-07-01 16:00:00', '2011-07-01 17:00:00', '2011-07-01 18:00:00', '2011-07-01 19:00:00', '2011-07-01 20:00:00', '2011-07-01 21:00:00', '2011-07-01 22:00:00', '2011-07-01 23:00:00') 

預先感謝您可以提供任何幫助。

+0

是第二個查詢給出較少的結果(因此是錯誤的)..你在日期條件給出了特定的時間,可能會減少結果集。 –

回答

0

WHERE子句之前分組施加同時具有被之後施加。因此,在第二個查詢中,您有GROUP BY且沒有WHERE子句,MySql會返回一個隨機(未確定的)單行,然後將HAVING子句應用到它。

+0

道歉,對於上面的例子,我剝去了所有相同的東西,我可以排除這個問題,但是我剝去了太多。爲了完整性,我在第二個查詢中添加了where子句。在現實世界中,這是200行UNION查詢的一部分,在一個視圖中返回6個不同的結果集。 – Hadleigh

+0

看看你當前的查詢,你的第一個查詢在兩個給定時間之間返回每個id的* starttime *,第二個查詢返回一個未確定(隨機)的行,然後檢查它的* starttime *是否在給定的時間和if不排除結果。這兩個結果完全不同。 – nobody

+0

對不起,我正在變厚。感謝您的額外解釋,現在非常有意義。 – Hadleigh

0

Group by與聚合函數 - sum,min,max,count一起使用。您的查詢在「選擇」中似乎沒有聚合 - 所以group by不會執行任何操作。

雖然您的查詢可能是有效的SQL,但它沒有任何意義。不知道這是爲什麼你的條款會變得瘋狂。

+0

在這種情況下,Group by可以確保將許多IDS簡化爲一個,因此我可以在日期範圍內獲得唯一IDS的數量。 – Hadleigh

+0

我的意思是,如果它在小時1發生,我想要將其統計爲唯一,但如果發生在小時2,則不再是唯一的。我只想記錄一次,而不管它發生多少次。 – Hadleigh

+0

我在查詢2中看到的問題是合法的唯一ID只是沒有被記錄。因此,在查詢1可能在16:00和17:00之間找到1個ID的情況下,查詢2不會。 – Hadleigh

0

我假設「id」是您桌子上的主鍵,對嗎?我猜你希望在發生各種事件的日子裏顯示時間,但我不確定你爲什麼會按ID進行分組。你能舉一個例子說明你希望輸出看起來如何嗎?

+0

ID不是主鍵,可能有很多ID。這是一個更大的查詢的一部分,但實質上,它應該在第一次計算+1時找到唯一ID,然後再打折。 – Hadleigh