Multi-table SQL select 语句 & cfoutput 语法
Multi-table SQL select statement & cfoutput syntax
我教高中生网页设计。最近我向他们介绍了 SQL 和 coldfusion 的动态网页设计。我一直保持它相当简单,但我确实想向他们展示一个复杂的 SQL 语句和一个复杂的 cfoutput。不幸的是,我把问题弄得太复杂了,我无法弄清楚!这是我的数据库结构的图片:
我正在尝试输出每个 class 中注册的学生列表以及 class 提供的课程,以及教授 class 的老师。这是我尝试输出的示例
机器人
第 1 节
史密斯先生
- 弗莱,凯伦
- 约翰逊,约翰尼
- 特纳,海莉
然后我要输出下一个class的信息,依此类推
这是我使用的 cfoutput 代码:
<cfoutput query="getRoster" group="staff">
#firstname# #lastname#<br>
#className#<br>
#sessionNumber#<br>
#title# #lastname#<br>
<cfoutput>
`<ol><li>#lastname#, #firstname#</li></ol>`
</cfoutput>
</cfoutput>
假设您的查询 returns 数据已经正确,您就接近了。查询只需要做一些更改:
由于 "firstName" 和 "lastName" 列存在于多个 table 中,查询必须对每个列应用不同的列 alias,即SELECT student.lastName AS StudentLastName, ....
。不然CF看到#firstName#
和#lastName#
.
不知道输出哪个值
cf 输出可能 className
"group",而不是 staff
。否则,如果同一职员分配给多个 class 人员,它不会显示所有 class 姓名。
CFOutput "group" 要求对查询结果进行排序。确保查询是 ORDER(ed) BY className
(或您分组依据的任何列),否则 cfoutput 将无法正确显示。
为了生成列表编号,<ol>
元素属于内部 <cfoutput>
循环之外。
查询:
SELECT
c.className
, c.sessionNumber
, s.LastName AS StaffLastName
, s.FirstName AS StaffFirstName
, st.LastName AS StudentLastName
, st.FirstName AS StudentFirstName
FROM class c
INNER JOIN staff s ON s.id = c.staff
INNER JOIN studentOld st ON st.class1 = c.id
OR st.class2 = c.id
OR st.class3 = c.id
OR st.class4 = c.id
ORDER BY c.className, st.LastName, st.FirstName
CF
<cfoutput query="getRoster" group="className">
#StaffTitle# #StaffLastName# #StaffLastName#<br>
#className#<br>
#sessionNumber#<br>
<ol>
<cfoutput>
<li>#StudentLastName#, #StudentFirstName#</li>
</cfoutput>
</ol>
</cfoutput>
改进
就是说,如果可能的话,我会重组学生 table,因为这不是表示 student
和 class
之间存在的 many-to-many 关系的典型方式. (现在最好加强良好的数据库结构习惯!)一个更清晰、更规范化的方法是从学生 table 中删除 classX
列。然后将这些关系存储在单独的 table - 作为单独的行 - 而不是列。这允许根据需要灵活地进行尽可能多或尽可能少的注册。
CREATE TABLE student (
id int
, lastName varchar(100)
, firstName varchar(50)
)
-- stores each combination of student + class as a separate row
CREATE TABLE studentClass (
student int
, class int
)
然后你可以摆脱所有 OR
语句并检索 classes 和注册学生,使用稍微干净的 JOIN:
SELECT ...
FROM class c
INNER JOIN staff s ON s.id = c.staff
INNER JOIN studentClass sc ON sc.class = c.id
INNER JOIN student st ON st.id = sc.student
ORDER BY ....
我教高中生网页设计。最近我向他们介绍了 SQL 和 coldfusion 的动态网页设计。我一直保持它相当简单,但我确实想向他们展示一个复杂的 SQL 语句和一个复杂的 cfoutput。不幸的是,我把问题弄得太复杂了,我无法弄清楚!这是我的数据库结构的图片:
我正在尝试输出每个 class 中注册的学生列表以及 class 提供的课程,以及教授 class 的老师。这是我尝试输出的示例
机器人
第 1 节
史密斯先生
- 弗莱,凯伦
- 约翰逊,约翰尼
- 特纳,海莉
然后我要输出下一个class的信息,依此类推
这是我使用的 cfoutput 代码:
<cfoutput query="getRoster" group="staff">
#firstname# #lastname#<br>
#className#<br>
#sessionNumber#<br>
#title# #lastname#<br>
<cfoutput>
`<ol><li>#lastname#, #firstname#</li></ol>`
</cfoutput>
</cfoutput>
假设您的查询 returns 数据已经正确,您就接近了。查询只需要做一些更改:
由于 "firstName" 和 "lastName" 列存在于多个 table 中,查询必须对每个列应用不同的列 alias,即
SELECT student.lastName AS StudentLastName, ....
。不然CF看到#firstName#
和#lastName#
. 不知道输出哪个值
cf 输出可能
className
"group",而不是staff
。否则,如果同一职员分配给多个 class 人员,它不会显示所有 class 姓名。CFOutput "group" 要求对查询结果进行排序。确保查询是 ORDER(ed) BY
className
(或您分组依据的任何列),否则 cfoutput 将无法正确显示。为了生成列表编号,
<ol>
元素属于内部<cfoutput>
循环之外。
查询:
SELECT
c.className
, c.sessionNumber
, s.LastName AS StaffLastName
, s.FirstName AS StaffFirstName
, st.LastName AS StudentLastName
, st.FirstName AS StudentFirstName
FROM class c
INNER JOIN staff s ON s.id = c.staff
INNER JOIN studentOld st ON st.class1 = c.id
OR st.class2 = c.id
OR st.class3 = c.id
OR st.class4 = c.id
ORDER BY c.className, st.LastName, st.FirstName
CF
<cfoutput query="getRoster" group="className">
#StaffTitle# #StaffLastName# #StaffLastName#<br>
#className#<br>
#sessionNumber#<br>
<ol>
<cfoutput>
<li>#StudentLastName#, #StudentFirstName#</li>
</cfoutput>
</ol>
</cfoutput>
改进
就是说,如果可能的话,我会重组学生 table,因为这不是表示 student
和 class
之间存在的 many-to-many 关系的典型方式. (现在最好加强良好的数据库结构习惯!)一个更清晰、更规范化的方法是从学生 table 中删除 classX
列。然后将这些关系存储在单独的 table - 作为单独的行 - 而不是列。这允许根据需要灵活地进行尽可能多或尽可能少的注册。
CREATE TABLE student (
id int
, lastName varchar(100)
, firstName varchar(50)
)
-- stores each combination of student + class as a separate row
CREATE TABLE studentClass (
student int
, class int
)
然后你可以摆脱所有 OR
语句并检索 classes 和注册学生,使用稍微干净的 JOIN:
SELECT ...
FROM class c
INNER JOIN staff s ON s.id = c.staff
INNER JOIN studentClass sc ON sc.class = c.id
INNER JOIN student st ON st.id = sc.student
ORDER BY ....