多个表中的SQL计数超过1个值
我有一个类似以下内容的DB模式:多个表中的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
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,并试图找到一些更活跃的项目。谢谢