PostgreSQL:获取连接查询中的行数

PostgreSQL: Get the count of rows in a join query

我正在尝试将一些数据加入少数 table 中。我有一个审核 table,我在其中存储对用户执行的操作的审核。我试图按照他们拥有的审核次数和审核次数的顺序获取用户列表。我有以下查询:

SELECT s.user_created, 
u.first_name, 
u.last_name, 
u.email, 
a.message as audits 
FROM cbrain_school s
inner join ugrp_user u on s.user_created = u.user_id 
inner join audit a on u.user_id = a.user_id 
order by u.created_time desc;

此查询将为我提供审计中每个条目 1 行 table。我只想要每个用户 1 行,并且审计中的条目数 table 按审计数量排序。

有什么办法吗?当我试图在上面的查询

中包含 count() 时出现错误

首先,您将加入 table cbrain_school。为什么?您未从此 table 中选择任何数据(s.user_created 除外,它只是 u.user_id)。我想你想限制用户显示 cbrain_school.user_created?然后使用 EXISTSIN 查找。

select u.user_id, u.first_name, u.last_name, u.email, a.message as audits
from ugrp_user u
inner join audit a on u.user_id = a.user_id
where u.user_id in (select user_created from cbrain_school)
order by u.created_time desc;

这更好地表明 cbrain_school.user_created 只是标准。 (当然,查询结果是一样的。)当您对连接的行不是很感兴趣时,避免连接是一个好习惯。

现在您不想再显示每条消息,而只是按用户计数。因此,与其加入消息,不如加入消息数:

select u.user_id, u.first_name, u.last_name, u.email, a.cnt
from ugrp_user u
inner join
(
  select user_id, count(*) as cnt
  from audit
  group by user_id
) a on u.user_id = a.user_id
where u.user_id in (select user_created from cbrain_school)
order by u.created_time desc;

(您也可以加入所有消息,然后才聚合,但我不推荐这样做。它适用于此查询和许多其他查询,但在处理多个 table 时容易出错,你可能会突然计数或累加成倍的值。在聚合之前加入是一个好习惯。)