0

我无法正确制定 MySQL 查询。我尝试过的一切都没有给我需要的东西,或者给出了语法错误。

我有三个表:Clients、Courses 和 CoursesForClients。

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

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

Courses 表存储课程名称及其 ID。

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

CoursesForClients 表具有 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

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

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

看起来应该很容易为此设置查询,使用 JOIN 和可能的 GROUP BY,但我在这里遇到了一个障碍,似乎无法正确处理。因此,任何帮助将不胜感激。谢谢!

4

1 回答 1

2

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

您的表示层将通过注意每个新客户端的第一行并拆分客户端标题来格式化该表。您将在 php 或 Java 或 Crystal Reports 或一些类似的演示技术中做到这一点。

您的查询是这样的。

    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 的陷阱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
于 2015-06-08T00:07:44.443 回答