如何制定查询以显示一个人参加的所有课程
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
我在正确制定 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