所以我必须执行上述操作并使用Postgres 8.3,因此我无法使用窗口函数。 我不能使用LIMIT功能(这是一个家庭作业问题)。
我有这样的查询(我省略了desc条件):
SELECT MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS STT
会员列表包含每个人都有一个desc和一个工作的成员。 会员可以有多个工作。因此,上述查询会对每个成员进行计数,以查看他们拥有多少个作业(因为每个成员都有自己的ID)。
现在,我的问题是上面的查询只能获得1个人拥有的最大工作数,但是一旦我尝试获得该问题的相应名称,我就会遇到问题。
SELECT mi.name, MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) STT JOIN memberinfo mi ON (stt.id = mi.id)
GROUP BY mi.name;
以上给了我所有人的名字(我认为),而不仅仅是那些工作人数最多的人(应该是3名成员,每人有25个工作岗位)。我使用了memberlist中的id并将其与memberinfo一起使用,以获取memberinfo中的名称。
那么我怎样才能得到每个拥有最多工作数的人的名字,所以我有3行两列(姓名,数字工作)作为我的解决方案?
我确实做了另一个丑陋但有效的查询。 这是:
SELECT mi.name, stt.count
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) stt
JOIN memberinfo mi ON (mi.id = stt.id)
WHERE stt.count =
(
SELECT MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS MAXSTT
)
我认为这个解决方案并不是一个非常好的解决方案,因此我希望改进它或使用其他方法。
答案 0 :(得分:1)
您可以修改内部查询以加入memberlist
,以便检索所需的列。然后,您可以通过having count(*) = (subquery)
SELECT m.id, mi.name, count(*) as count
FROM memberlist m
JOIN memberinfo mi ON m.id = mi.id
WHERE desc = ...some conditions...
GROUP BY m.id, mi.name
HAVING count(*) = (
SELECT MAX(count)
FROM (
SELECT id, count(*) as count
FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS MAXSTT
)
答案 1 :(得分:0)
我认为使用EXIST可能会有所改善。我认为你的查询应该是这样的:
SELECT mi.name, stt.count
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) stt
JOIN memberinfo mi ON (mi.id = stt.id)
WHERE exists
(
SELECT MAX(count)
FROM
(
SELECT id, count(*) as count FROM memberlist
WHERE desc = ...some conditions...
GROUP BY id
) AS MAXSTT
having MAX(MAXSTT.count)=stt.count
)