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

PostgreSQL:获取联接查询中的行数,sql,inner-join,postgresql-9.3,Sql,Inner Join,Postgresql 9.3,我正在尝试将一些数据连接到几个表中。我有一个审计表,用于存储用户执行的操作的审计。我试图按照用户审核次数和审核次数的顺序获取用户列表。我有以下疑问: 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

我正在尝试将一些数据连接到几个表中。我有一个审计表,用于存储用户执行的操作的审计。我试图按照用户审核次数和审核次数的顺序获取用户列表。我有以下疑问:

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行。我只希望每个用户有一行,审计表中的条目数按审计次数排序


有没有办法做到这一点。当我试图在上面的查询中包含
count()
时,我遇到了一个错误

首先,您要加入表
cbrain\u school
。为什么?您没有从此表中选择任何数据(除了创建的
s.user\u
,它只是
u.user\u id
)。我想您想将显示的用户限制在
cbrain\u学校。用户创建的
?然后使用
EXISTS
中的
来查找此信息

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学校好得多。用户创建的
仅仅是标准。(当然,查询结果是一样的。)当您对连接的行不感兴趣时,避免连接是一个好习惯

现在,您不想再显示每条消息,只需按每个用户计算它们。因此,与其加入邮件,不如加入邮件计数:

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;

(您也可以联接所有消息,然后再进行聚合,但我不建议这样做。它适用于此查询和许多其他查询,但在处理多个表时容易出错,您可能会突然数到或将值累加几倍。在聚合之前联接是一个好习惯。)

我需要加入cbrain_school,因为我只需要属于该表的用户;您并不真正希望从表中获取数据,但希望将结果限制在该表中的用户。限制查询结果最好发生在
WHERE
子句中。因此,您可以使用
EXISTS
IN
WHERE
子句中检查此项,如图所示。在某些情况下(例如,如果一个用户可能有多个
cbrain_school
记录),这也可能会删除重复项。