我无法正确制定MySQL查询。我尝试过的所有内容都没有给出我需要的内容,或者给出了语法错误。
我有三个表:客户端,课程和CoursesForClients。
Clients表只有一个人的基本坐标: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,但我在这里有一个块,似乎无法正确。因此,任何帮助将非常感激。谢谢!
答案 0 :(得分:2)
表格中的SQL交易。根据定义,表有一堆行,每行都有相同的列。您的查询将产生一个结果集,该结果集复制了她所参加的每门课程的客户信息。
您的表示层将通过注意每个新客户端的第一行并打破客户端标头来格式化该表。您可以在php或Java或Crystal Reports或某些此类演示技术中执行此操作。
您的查询是这样的。
USING()
@Strawberry对使用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
上的相同查询。
{{1}}