我遇到嵌套查询的问题(问题因为我不知道怎么做) 我正在使用PostgreSQL
我有两张桌子:
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不应该显示,因为它的最后一个值是stat 3(显然不应该加倍,因为我有2个统计数据。
我可以通过多个查询来完成,但我想在1中完成。
由于
答案 0 :(得分: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'
答案 1 :(得分: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
这意味着所选行中的时间是> =该用户所有通话的时间。