1

我有一个嵌套查询的问题(这个问题我不知道该怎么做)我正在使用 PostgreSQL

我有 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 不应该显示,因为它的最后一个值是 stat 3(显然不应该加倍,因为我有 2 个统计数据。

我可以通过多个查询来完成,但我想在 1 中完成。

谢谢

4

2 回答 2

2

因此,您想获取每个Users.id. 你用 group by 来做这件事。然后,一旦您获得最后一个呼叫 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

于 2013-06-04T17:43:16.693 回答
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

这意味着所选行中的时间 >= 该用户所有呼叫的时间。

于 2013-06-04T17:47:10.690 回答