Multi-table SQL select 语句 & cfoutput 语法

Multi-table SQL select statement & cfoutput syntax

我教高中生网页设计。最近我向他们介绍了 SQL 和 coldfusion 的动态网页设计。我一直保持它相当简单,但我确实想向他们展示一个复杂的 SQL 语句和一个复杂的 cfoutput。不幸的是,我把问题弄得太复杂了,我无法弄清楚!这是我的数据库结构的图片:

我正在尝试输出每个 class 中注册的学生列表以及 class 提供的课程,以及教授 class 的老师。这是我尝试输出的示例

机器人
第 1 节
史密斯先生

  1. 弗莱,凯伦
  2. 约翰逊,约翰尼
  3. 特纳,海莉

然后我要输出下一个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 数据已经正确,您就接近了。查询只需要做一些更改:

  1. 由于 "firstName" 和 "lastName" 列存在于多个 table 中,查询必须对每个列应用不同的列 alias,即SELECT student.lastName AS StudentLastName, ....。不然CF看到#firstName##lastName#.

  2. 不知道输出哪个值
  3. cf 输出可能 className "group",而不是 staff。否则,如果同一职员分配给多个 class 人员,它不会显示所有 class 姓名。

  4. CFOutput "group" 要求对查询结果进行排序。确保查询是 ORDER(ed) BY className(或您分组依据的任何列),否则 cfoutput 将无法正确显示。

  5. 为了生成列表编号,<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,因为这不是表示 studentclass 之间存在的 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 ....