2015-05-04 32 views
1

我是SQL新手,但我很確定這裏發生了一些奇怪的事情。我有一個帶有4列(RoomNum,EventName,EventStatus,EventDateTime)的表(eventtable)的MySQL數據庫。同一張桌子上的兩個查詢顯示具有不同值的相同行嗎?

某些EventNames會隨着EventStatus在不同時間切換ON和OFF而重複。我想獲得最新的條目,以便我有「當前」的狀態,所以我用:

select RoomNum, EventName, EventStatus, max(EventDateTime) as MaxDate 
    from eventtable where eventName = "DND" 
    group by RoomNum 

,導致: eventtable_maxtime_DND_partial

只是爲了確保一切正常,我檢查每個房間,以確保它是給最新的一個用:

SELECT * FROM `eventtable` 
where RoomNum = "070#" and eventname = "DND" /*where "#" is a specific digit*/ 
order by eventdatetime asc 

第一個看起來很不錯: eventtable_701_DND

但其他人不這樣做! (該EventStatus是錯誤的,即使時間是正確的):eventtable_702_DND eventtable_703_DND eventtable_704_DND

我不明白的是,EventDateTime匹配它告訴我,我在看同一行的數據,但是又如何能內部值(EventStatus)是不同的?

請幫忙。謝謝。

回答

1

通過使用以下查詢,您可以根據您的要求得到結果。請嘗試。

select * from(從EventTable中選擇RoomNum,EventName,EventStatus,EventDateTime,其中eventName =「DND」order by EventDateTime desc)Room group by RoomNum;

+0

確實如此!您的查詢不僅可以工作(我已手動檢查條目),它的運行速度也比我的JOIN過濾嘗試速度快。現在我只需要剖析你的代碼,試着理解你在做什麼。僅供參考 - 使用INNER JOIN,因此我的第一張表格可以包含所有列,並在計算機上顯示正確的數據需要40秒。這個搜索需要1.4s!謝謝。 – janson

1

這就是爲什麼火鳥不允許這樣做。只有這是有效的

select RoomNum, max(EventDateTime) as MaxDate 
from eventtable where eventName = "DND" 
group by RoomNum 

EventNameEventStatus值是任意的。你還沒有告訴它你想要哪個。我不認爲你可以。 RoomNumn由於"group by"而隱含。

要獲得您想要的數據,一種方法是使用max(EventDateTime)返回引用的子查詢。

+1

感謝您的及時回覆。我不完全理解爲什麼EventName和EventStatus會是任意的(但我真的是新手),問題在於它也顯示了正確的東西,這使得它變得非常混亂。我猜我必須做的(我認爲我看到其他人做的)是做一個加入與我的表有一個EventName和EventStatus其中a.RoomNum = b.RoomNum AND a.EventDateTime = b.EventDateTime。希望這樣的事情會起作用。 – janson

+0

在group by中,它只查看group by子句中的值和聚合值。它不適用於行。因此,它無法從特定行中返回該最大日期值所在的值。 –

相關問題