我有一个返回以下结果的查询(示例):
+----+-----------+------------+
| ID | FirstName | CourseName |
+----+-----------+------------+
| 1 | Alice | X |
| 2 | Bob | X |
| 2 | Bob | Y |
+----+-----------+------------+
查询需要3个表(用户,用户课程和课程),并且使用JOIN返回用户的id和他的名字,以及他所在的所有课程的所有名称。
我需要创建一个返回特定课程中用户的查询,例如:
查询X和Y的结果将是:
+----+-----------+
| ID | FirstName |
+----+-----------+
| 2 | Bob |
+----+-----------+
答案 0 :(得分:1)
假设用户表和课程表具有id和name列,而user-courses只有外键id,则可以执行以下操作:
对于第一个问题:
select u.* from user u
inner join user-courses uc on uc.user_id=u.id
inner join course c on c.id=uc.course_id and c.name='X';
它在内部联接上过滤用户,并过滤最后一部分的过程(c.name =' X')。您可以使用任何其他方式进行过滤。
对于第二个:
select * from user
where id in (
select distinct a.* from (
select user_id from user-courses uc inner join course c
on c.id=uc.course_id
where c.name='X'
) a
inner join (
select user_id from user-courses uc inner join course c
on c.id=uc.course_id
where c.name='Y'
) b
on a.user_id=b.user_id
);
MS-Access没有交叉,所以我使用内连接(在a和b之间)来实现相同的结果。 A是来自课程用户的表格' X'和' Y'。内部联接与两者相交,从而产生两个课程中的用户。然后我使用id来过滤。
我没有MS访问权限,所以我尝试使用PostgreSQL,但我使用的是SQL-ANSI,所以我希望如此。