多个表中的SQL计数超过1个值

多个表中的SQL计数超过1个值,sql,postgresql,Sql,Postgresql,我有一个类似以下内容的DB模式: CREATE TABLE projects (project_id int); CREATE TABLE project_members (user_id int, project_id int); CREATE TABLE project_issues (issue_id int, project_id int); 我想要的是找到所有有10个或更多成员以及10个或更多问题的项目。我很难对此提出质疑 我希望输出类似于: project_id | members

我有一个类似以下内容的DB模式:

CREATE TABLE projects (project_id int);
CREATE TABLE project_members (user_id int, project_id int);
CREATE TABLE project_issues (issue_id int, project_id int);
我想要的是找到所有有10个或更多成员以及10个或更多问题的项目。我很难对此提出质疑

我希望输出类似于:

project_id | members | issues
-----------+---------+-------
65         | 100     | 23
93         | 78      | 45
最好按成员排序,然后按问题排序

我提出了:

SELECT projects.project_id, COUNT(project_members.user_id) FROM 
project_members LEFT JOIN projects ON 
project_members.project_id = projects.project_id GROUP BY projects
ORDER BY count;
但我也不知道如何把它带到下一个计算问题的层面


我正在使用PostgreSQL 9.1

这可能会更有效,但它给出了正确的结果

SELECT 
  p.project_id,
  m.members,
  i.issues
FROM projects AS p
LEFT JOIN 
  (
      SELECT project_id, COUNT(user_id) AS members 
      FROM project_members 
      GROUP BY project_id
  ) AS m
ON p.project_id = m.project_id
LEFT JOIN 
  (
      SELECT project_id, COUNT(issue_id) AS issues 
      FROM project_issues
      GROUP BY project_id
  ) AS i
ON p.project_id = i.project_id
WHERE members > 10 AND issues > 10
ORDER BY members, issues;

这可能会更有效,但它给出了正确的结果

SELECT 
  p.project_id,
  m.members,
  i.issues
FROM projects AS p
LEFT JOIN 
  (
      SELECT project_id, COUNT(user_id) AS members 
      FROM project_members 
      GROUP BY project_id
  ) AS m
ON p.project_id = m.project_id
LEFT JOIN 
  (
      SELECT project_id, COUNT(issue_id) AS issues 
      FROM project_issues
      GROUP BY project_id
  ) AS i
ON p.project_id = i.project_id
WHERE members > 10 AND issues > 10
ORDER BY members, issues;

更简单、更快一点:

SELECT p.project_id, m.members, i.issues
FROM   projects p
JOIN  (
    SELECT project_id, count(*) AS members 
    FROM   project_members 
    GROUP  BY project_id
    HAVING count(*) >= 10
    ) m USING (project_id)
JOIN  (
    SELECT project_id, COUNT(*) AS issues 
    FROM   project_issues
    GROUP  BY project_id
    HAVING count(*) >= 10
    ) i  USING (project_id)
ORDER  BY m.members DESC, i.issues DESC;
既然你想要项目

有10个或更多成员以及10个或更多问题的

。。您可以通过
JOIN
have
尽早淘汰不符合条件的候选人,以获得更快的结果。
再加上一些其他的小调整

=10
>9
表示“10或更多”

警惕“代理交叉连接”:

更简单、更快一点:

SELECT p.project_id, m.members, i.issues
FROM   projects p
JOIN  (
    SELECT project_id, count(*) AS members 
    FROM   project_members 
    GROUP  BY project_id
    HAVING count(*) >= 10
    ) m USING (project_id)
JOIN  (
    SELECT project_id, COUNT(*) AS issues 
    FROM   project_issues
    GROUP  BY project_id
    HAVING count(*) >= 10
    ) i  USING (project_id)
ORDER  BY m.members DESC, i.issues DESC;
既然你想要项目

有10个或更多成员以及10个或更多问题的

。。您可以通过
JOIN
have
尽早淘汰不符合条件的候选人,以获得更快的结果。
再加上一些其他的小调整

=10
>9
表示“10或更多”

警惕“代理交叉连接”:

这很有效:)。我正在处理一堆Github,并试图找到一些更活跃的项目。谢谢这很有效:)。我正在处理一堆Github,并试图找到一些更活跃的项目。谢谢