我想发出一个SQL请求来显示用户列表,但只显示自至少60天以来尚未接受任务的用户列表。用户有多个用户任务附加到他身上,因此我需要查看所有这些任务并仅在60天内未接受任务时显示用户。
这是我到目前为止所做的,但这是错误的,即使他已经接受了不到60天前的任务,用户仍然在列表中,但是任务并没有显示出来。所以这个请求只显示60天前被接受的每个任务。那不是我想要的。
SELECT
u.username, u.id, u.email, date_part('days', now() - um.date_accepted) as "days since last mission"
FROM
users_user u
INNER JOIN
users_usermission um
ON
u.id=um.user_id
WHERE
date_part('days', now() - um.date_accepted) > 60
答案 0 :(得分:1)
您可以使用聚合和左连接来执行您想要的操作。我会这样做:
SELECT u.username, u.id, u.email,
date_part('days', now() - um.date_accepted) as "days since last mission"
FROM users_user u LEFT JOIN
(SELECT um.user_id, MAX(date_accepted) as maxda
FROM users_usermission um
GROUP BY um.user_id
) um
ON u.id = um.user_id
WHERE maxda <= CURRENT_DATE - interval '60 days' or
maxda IS NULL;
我不确定SELECT
子句中的复杂计算是什么,但我将其留在其中。它似乎不是您问题的一部分。
答案 1 :(得分:1)
我认为使用相关not exists
谓词的查询会起作用:
SELECT
*
FROM
users_user u
WHERE NOT EXISTS (
SELECT 1 FROM users_usermission um
WHERE u.id = um.user_id
AND um.date_accepted > CURRENT_DATE - interval '60 days'
);
这只会返回过去60天内没有任何任务的用户。
有关示例,请参阅此sample SQL Fiddle。
答案 2 :(得分:0)