2010-11-30 131 views
0

我要編寫一個查詢數據庫,有這樣的表:SQL GROUP BY問題

TABLE HISTORY: 
ID | ITEM_ID | USER_ID | DATE 

ITEM TABLE: 
ID | NAME | OWNER_ID 

歷史表中包含的所有操作由用戶項的記錄。 我必須寫一個查詢,從HISTORY表中獲取所有項目,這些項目不在所有者手中。所以,它應該爲每個項目記錄最後的記錄,並從中選擇那些僅僅保留在所有者手中的記錄。

我試着使用嵌套查詢來寫,但如果我用這樣的子查詢:

SELECT ITEM_ID, MAX(DATE) 
FROM HISTORY 
GROUP BY ITEM_ID 

我不能把這個記錄的ID。所以,我不能遍歷嵌套的查詢結果,因爲我不知道它們ID的ID。

你能幫我嗎?

P.S.你能否告訴我未來,如何從分組中逐條查詢列,而不是按組列出?

回答

4

我對這個問題的理解是,您希望所有最近的歷史記錄條目都是由非所有者用戶創建的條目。如果我錯了,請糾正我。

select h.item_id 
from item i 
    inner join history h 
     on h.item_id = i.id and i.owner_id != h.user_id 
    inner join (select item_id, max(id), max(date) as date 
       from history 
       group by item_id) mh 
     on mh.item_id = h.item_id and h.date = mh.date 

以上查詢假定日期時間在日期列中具有一定的唯一性保證。如果沒有,你可以使用history.id,如果它是一個完美的自動遞增的標識列,並且你保證永遠不會讓任何人陷入困境(好吧,也許不那麼嚴格,但你明白了我的觀點)。

在這種情況下:

select h.item_id 
from item i 
    inner join history h 
     on h.item_id = i.id and i.owner_id != h.user_id 
    inner join (select item_id, max(id) as id 
       from history 
       group by item_id) mh 
     on mh.id = h.id 
+0

是。我也想過使用日期來加入子查詢。但是如果在一天之內已經有多個項目的操作。他們有同樣的日期。怎麼運行的? – Ilnur 2010-11-30 21:14:35