sql - 如何在 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
...
...
...
这是我的结果,这是正确的。这是我查询中的所有用户都注册的唯一课程
- cm.course_id -> "I3016-BMAN-62082-1201-2SE-005000"
- cm.course_name -> “BMAN62082 国际组织变革管理 2020-21 第二学期”
- 创建日期 -> 2020-08-24 11:30:22.064
- 修改日期 -> 2020-08-24 11:32:45.978
有没有更优雅的解决方案?
任何帮助将不胜感激。
谢谢
解决方案
如果你想要一个交叉点——即所有 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;
推荐阅读
- sql - 在锁步中取消嵌套存储为文本的多个数组列
- python - Django Annotate - 获取注释中的数字列表
- django - 一个包含多个 django 项目的数据库
- r - 用于绘图的阴影图形设备
- javascript - 当 ref 的值发生变化时,Vue 不会更新模板 Vue 3
- python - 获取列数据框中给定复杂条件的索引
- unit-testing - Visual Studio Enterprise 2019,“配置文件”单元测试导致错误:文件不包含数据缓冲区
- powershell - 如何从 https://www.googleapis.com/oauth2/v3/certs 生成符合 PEM 或 x509 的证书?
- python - python中的模板化对象生成
- php - 如何将数组写入文件 PHP?