我们在PostgreSQL 12中有这些表:
用户-> id,名称,电子邮件items -> id, user_id, description
我们想要运行一个查询来查找拥有1项或更少的用户。
我尝试使用连接语句,并在WHERE子句中尝试将用户计数<1 .查询
select * from "user" inner join item on "user".id = item.user_id where count(item.user_id) < 1;
但是它失败了,给了我这个错误。
ERROR: WHERE不允许使用聚合函数第一行:……"用户"上的内连接项。Id = item。User_id where count(item…)
所以我认为查询需要更多的技术。有人能帮我一下吗?由于
你可以这样做:
select u.*
from user u
left join (
select user_id, count(*) as cnt from items group by user_id
) x on x.user_id = u.id
where x.cnt = 1 or x.cnt is null
从技术上讲,您不需要为此使用JOIN。您可以使用GROUP BY
从item
表中获得所有必要的数据。诀窍是您需要使用HAVING
而不是WHERE
来聚合数据,如COUNT()
SELECT user_id
FROM item
GROUP BY user_id
HAVING COUNT(id) > 1
但是如果你想从user
表中看到更多的字段,我们可以添加一个JOIN
:
SELECT u.id, u.name, u.email
FROM item i
INNER JOIN "user" u on u.id = i.user_id
GROUP BY u.id, u.name, u.email
HAVING COUNT(i.id) > 1