【问题标题】:Select and group results using the same column as a parameter使用同一列作为参数选择和分组结果
【发布时间】:2016-04-26 20:35:12
【问题描述】:

我有一个返回以下结果的查询(示例):

+----+-----------+------------+
| ID | FirstName | CourseName |
+----+-----------+------------+
|  1 | Alice     | X          |
|  2 | Bob       | X          |
|  2 | Bob       | Y          |
+----+-----------+------------+

查询需要 3 个表(users、user-courses 和 course),使用 JOIN 返回用户的 id 和他的名字,以及他所在的所有课程的所有名称。

我需要创建一个查询来返回特定课程中的用户,例如:

  • 选择课程 X 中的所有用户:将返回 Alice 和 Bob 的详细信息。
  • 选择课程 X 和 Y 中的所有用户:将只返回 Bob,因为爱丽丝不在课程 Y 中。

查询 X AND Y 的结果将是:

+----+-----------+
| ID | FirstName |
+----+-----------+
|  2 | Bob       |
+----+-----------+

【问题讨论】:

  • 将预期结果添加到您的问题中。

标签: sql ms-access


【解决方案1】:

假设 user 表和 course 表有一个 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”的用户的表。内部连接与两者相交,导致用户同时在两个课程中。然后我使用 ids 进行过滤。

我没有 MS-access,所以我在 PostgreSQL 中尝试过,但我使用的是 SQL-ANSI,所以我希望如此。

【讨论】:

  • 太棒了!乐于助人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多