首页 > 解决方案 > 如何在 Postgres 中显示多个用户的匹配行?

问题描述

我是 Postgres 的新手,我希望检索一组特定用户作为课程负责人在同一课程中注册的课程列表。希望我已经解释清楚了。

它返回所有用户作为课程负责人注册的所有课程的列表,而不是他们作为课程负责人注册的相同课程的列表。

这是我的原始查询

select distinct(cm.course_id), cm.course_name, cm.dtcreated, cm.dtmodified 
from course_main cm
inner join course_users cu on cm.pk1 = cu.crsmain_pk1
inner join users u on u.pk1 = cu.users_pk1
where u.user_id IN ('msassar5','mfztsjc3', 'mzysshba', 'mftssag3', 'mfztslmi', 'mfztsml7', 'mtlsscm5', 'msdsshp2', 'mzysscp9', 'mcyssmy')
and role = 'P'  - 'P' denotes course leader
and cm.service_level = 'F' -- 'F' denotes full course
order by cm.course_id, cm.dtcreated asc

我需要比较每个用户作为课程负责人 (P) 注册的所有课程,并且只显示每个列表中的课程,但我不确定最佳方法。

我已经阅读了 INTERSECT 语句并使用它确实产生了我期望的结果,但这似乎是一个不优雅的解决方案,因为我必须为每个额外的用户在 INTERSECT 列表中添加另一个查询。

这是我的 INTERSECT 查询

select distinct(cm.course_id), cm.course_name, cm.dtcreated, cm.dtmodified 
from course_main cm
inner join course_users cu on cm.pk1 = cu.crsmain_pk1
left outer join users u on u.pk1 = cu.users_pk1
where u.user_id = '<USERNAME>'
and role = 'P'
and cm.service_level = 'F'
    intersect
select distinct(cm.course_id), cm.course_name, cm.dtcreated, cm.dtmodified 
from course_main cm
inner join course_users cu on cm.pk1 = cu.crsmain_pk1
left outer join users u on u.pk1 = cu.users_pk1
where u.user_id = '<USERNAME>'
and role = 'P'
and cm.service_level = 'F'
    intersect
    ...
    ...
    ...

这是我的结果,这是正确的。这是我查询中的所有用户都注册的唯一课程

有没有更优雅的解决方案?

任何帮助将不胜感激。

谢谢

标签: sqlpostgresql

解决方案


如果你想要一个交叉点——即所有 10 个用户都是领导者的课程——那么使用聚合和一个having子句:

select cm.course_id, cm.course_name, cm.dtcreated, cm.dtmodified 
from course_main cm join
     course_users cu
     on cm.pk1 = cu.crsmain_pk1 join
     users u
     on u.pk1 = cu.users_pk1
where u.user_id in ('msassar5', 'mfztsjc3', 'mzysshba', 'mftssag3', 'mfztslmi', 'mfztsml7', 'mtlsscm5', 'msdsshp2', 'mzysscp9', 'mcyssmy') and
      role = 'P' and
      cm.service_level = 'F' -- 'F' denotes full course
group by cm.course_id
having count(*) = 10;

推荐阅读