如何制定查询以显示一个人参加的所有课程

How to formulate query to show all courses taken by a person

我在正确制定 MySQL 查询时遇到问题。我尝试过的一切都没有给我所需的东西,或者给出了语法错误。

我有三个 table:客户、课程和 CoursesForClients。

客户table只有一个人的基本坐标:ID、姓名、地址、电子邮件等

+----------+-----------------------------+------+
| ClientID | Name        | Address       | etc. |
+----------+-----------------------------+------+
|    10    | Joe Smith   | 1 Main St.    | ...  |
|    20    | Bob Smith   | 2 Main St.    | ...  |
|   ...    | ... ...     | ... ... ...   | ...  |
+----------+-----------------------------+------+

课程 table 存储课程名称及其 ID。

+----------+-----------------------+
| CourseID | Name                  |
+----------+-----------------------+
|    100   | Intro. to Subject     |
|    200   | Intermediate Subject  |
|    300   | Advanced Subject      |
|    ...   | ... ... ... ...       |
+----------+-----------------------+

CoursesForClients table 具有 CourseID 和 ClientID。给定的客户可以参加多门课程,因此对于客户参加的每门课程,都有一行,其中包含此人的 ID 和课程 ID。

+----------+----------+
| CourseID | ClientID |
+----------+----------+
|   100    |     1    |
|   200    |     1    |
|   300    |     1    |
|   100    |     2    |
|   200    |     2    |
|   ...    |    ...   |
+----------+----------+

现在,我需要的是能够列出客户 - 只需一次 - 以及她参加的所有课程。因此,查询的结果可能如下所示:

10:Joe Smith
1 Main St.
Somewhere, AL

Intro. to Subject
Intermediate Subject
Advanced Subject
---------------------------

20:Bob Smith
2 Main St.
Somewhere, AL

Intro. to Subject
Intermediate Subject

所以这个输出反映了客户和课程之间的关系。这里的关键是,无论客户参加了多少课程,客户的详细信息只会出现一次,然后是她参加的所有课程的列表。

还有一个额外的变化,其中有另一个 table 列出了客户课程的成绩,并且该 GradeID 也存储在 CoursesForClients table 中,还有另一个 table 的等级,带有 ID 和等级说明。但我现在不会担心这个。现在,我想要的只是显示的基本输出,如上所述。

看起来为此设置查询应该很容易,使用 JOIN 和 GROUP BY,但我遇到了问题,似乎无法正确处理。因此,我们将不胜感激任何帮助。谢谢!

SQL 交易 table 秒。根据定义,table 有一堆行,每一行都有相同的列。您的查询将产生一个结果集,该结果集会复制客户参加的每门课程的信息。

您的表示层将通过注意每个新客户端的第一行并分解客户端 header 来格式化 table。您将在 php 或 Java 或 Crystal 报告或某些此类演示技术中执行此操作。

您的查询是这样的。

    SELECT a.id, a.name, a.address, a.etc,
           c.Name
      FROM Clients a
      JOIN CoursesForClients b USING(ClientID)
      JOIN Courses c USING(CourseID)
      ORDER BY a.id, c.CourseID

@Strawberry 很好地指出了使用 USING() 的陷阱。这是对 ON.

的相同查询
    SELECT a.id, a.name, a.address, a.etc,
           c.Name
      FROM Clients a
      JOIN CoursesForClients b ON a.ClientID = b.ClientID
      JOIN Courses c ON b.CourseID = c.CourseID
      ORDER BY a.id, c.CourseID