2013-06-04 124 views
1

我有一個嵌套查詢問題(beeing我不知道該怎麼做的問題) 我使用PostgreSQLSQL查詢,在連接表

濾波基於最後一個值我有2個表:

users 
id name 
1 x 
2 y 
3 z 

call 
id user_id time data 
1 1 00:10 stat1 
2 1 00:15 stat2 
3 3 00:10 stat2 
4 3 00:30 stat1 
5 3 00:45 stat2 
6 3 00:50 stat3 

什麼,我需要得到的是一個選擇的用戶,但只有當他們最後一次通話是STAT2。我遇到的問題是我不知道如何獲取最新的數據。

我的查詢:

SELECT users.*, call.* FROM users, call WHERE users.id=call.user_id AND call.id IN (SELECT id FROM call WHERE call.data='stat2') ORDER BY users.id 

我所得到的與那就是:

users 
id name id user_id time data 
1 x 2 1 00:15 stat2 
3 z 3 3 00:10 stat2 
3 z 5 3 00:45 stat2 

什麼,我需要得到是:

users 
id name id user_id time data 
1 x 1 1 00:15 stat2 

3不應該顯示爲它的最後一個值是stat3(顯然不應該加倍,因爲我有2個統計數據。)

我可以用多個查詢做到這一點,但我想這樣做在1

感謝

+0

爲什麼在上面的所有行中都有'id' 1?是'id'自動增量,這只是你的例子中的一個錯誤? –

+0

是的。這不是我正在使用的實際表格,所以我在這裏寫了它以更好地顯示問題。它應該是自動增量。通過編輯修正 – darthzejdr

回答

1

所以,你要獲得每個Users.id最後呼叫ID。你通過一個小組來做到這一點。然後,一旦你得到最後一次呼叫ID,你檢查最後一次呼叫ID的狀態是否爲stat2

查詢看起來像:

SELECT * 
FROM USERS U 
INNER JOIN 
    (SELECT user_id, MAX(id) AS last_id 
    FROM Calls c 
    GROUP BY user_id 
) t0 
ON t0.user_id = u.id 
INNER JOIN Calls c ON c.id = t0.last_id 
WHERE c.type = 'stat2' 

例小提琴:http://www.sqlfiddle.com/#!1/7016e/5

+0

非常感謝。像魅力一樣工作 – darthzejdr

0

嘗試使用ALL聲明:

SELECT users.*, call.* FROM users, call WHERE users.id=call.user_id AND call.id IN (SELECT id FROM call WHERE call.data='stat2') 
AND call.time >= all (select a.time from call a where a.user_id = users.id) ORDER BY users.id 

這意味着,在選擇行時間爲> =時間對所有對這個用戶的呼叫。

+0

工程也是如此,但已經有了明確的答案。 Thanx雖然 – darthzejdr