資料庫程式設計 – PHP+MySQL 第 十章 善用 View 視界查詢  上一頁     下一頁

 

10-4 多表格結合的 View

內容:

  • 10-4-1 複雜的視界 - 通用課程表

  • 10-4-2 範例研討:查詢班級開課

10-4-1 複雜的視界 通用課程表

(A) 系統功能:public_course View

到目前我們認識可以利用 View 來回復原來資料表的抽象格式,但回復功能不僅 simple_students simple_teachers 兩視界範圍而已。我們以 course_db 為例,此資料庫最主要提供系所規畫課程與每學期教師開課、學生選課、登錄成績功能,但有許多複雜關係,歸類如下:

(1) 系所全學年規畫了哪些課程、

(2) 老師在哪一個班級、開哪一門課、

(3) 同一門課,不同老師可能在不同班級開課、

(4) 學生可以隨意選課,不一定在自己班級、

(5) 開課以班級為單位,不列入系所、

(6) 學生同一門課不可同時修 2 次以上、、、等條件限制。

從資料庫邏輯設計(或正規化原則)的觀點,我們為了滿足上述條件,我們將課程相關資料分割為若干個資料表來存放,並在資料表之間建立關聯,這是關聯式資料庫系統的最基本原理。但從第 6 章到第 9 章為止,我們用巢狀、合併與混合等技巧就是為了要克服這些雜亂的資料表中萃取資訊之目的。

如果,我們可以建立一個 View 來回復原來需求的資料,摒除掉一些為了滿足正規化所增加的欄位,也許在資料查詢就可以方便許多,然而,它又是一個抽象不存在的表格,也不會破壞原來正規化原則。如下圖所示,我們將 classesopen_courseall_course simple_teachers 等表格合併,找出『這學期』與教師開課全部相關的資料,建立一個 View,如果要查詢系所開課、教師開課、班級開課、課程資料、學生選課、、等等,只要與課程相關的資料都由這個 View 就可以找到。所建立 public_course 視界的結構是 {開課代碼、課程名稱、班級名稱、教師名稱、必選修、學分數}

 (B) 利用 SQL 命令產生 public_course View,語法如下:(系統已建立)

Create view public_course as

Select B.open_course_ID, C.course_ID, C.course_name, A.class_name,

D.name as Teacher_name, C.required, C.credit

From classes as A, open_course as B, all_course as C, simple_teachers as D

Where A.class_ID = B.class_ID

And B.course_ID = C.course_ID

And B.teacher_ID = D.teacher_ID;

(C) 直接用SQL 驗證該視窗是否滿足需求:

select *

from public_course;

10-4-2 範例研討 查詢班級開課

(A) 系統功能:Ex10_2

學務處需要一套可供查詢各班所開課程的網頁,查詢網頁的格式如下。

執行結果的網頁格式如下:

 (B) SQL 系統分析

這個題目用原來的系統結構,可需要合併好幾個資料表,我們嘗試使用 public_course 視界來做看看。如下圖所示,我們只要一個查詢語句就可以完成。

SQL程式如下:(請在 AppServ 平台測試 $class_name = ‘進四資管二丙’)

Select course_ID, course_name, class_name, teacher_name, required, credit

From public_course

Where class_name = ‘$class_name’;

(C) 網頁製作技巧

吾人依照上述 SQL 程式設計,網頁設計如下:

(D) 查詢網頁的程式範例:Ex10_2-form.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<?php

        $select_db = mysqli_connect("localhost", "root", "12345678", "course_db")

                or die("MySQL 伺服器連結失敗 <br>");

        // 查詢班級名稱

        $sql_query = "select class_name

                   from classes";

        $result = mysqli_query($select_db, $sql_query);

   echo "<p><font size='3'> 查詢班級所開課程 </font></p>";

   echo "<form name='表單' method='post' action='Ex10_2-action.php'>";

        //選擇教師

        echo "<select name='class_name'>";

        while($row=mysqli_fetch_row($result)) {

            echo "<option value='$row[0]'> $row[0] </option><BR>";

            }

                echo "</select>";

                echo "<BR><BR>";

                echo "<input type='submit' value='送出'>";

        echo "</form>";

    mysql_close($db_link);

?>

(E) 執行網頁的程式範例:Ex10_2-action.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<?php

        $class_name = $_POST["class_name"];

        $select_db = mysqli_connect("localhost", "root", "12345678", "course_db")

                or die("MySQL 伺服器連結失敗 <br>");

        // 查詢班級開課課程

    $sql_query = "Select course_ID, course_name, class_name, teacher_name,

                             required, credit

                  From public_course

                  Where class_name = '$class_name'";

        $result = mysqli_query($select_db, $sql_query);

       

        $items = array("課程編碼", "課程名稱", "班級名稱", "授課教師",

"必選修", "學分數");

        echo "<table border = '2'><tr align='center'>";

        // 利用 foreach 迴圈印出陣列 $item

        foreach ($items as $value) {

                echo "<td> $value </td>";

        }

        echo "</tr>";

        while($row=mysqli_fetch_row($result)) {

                echo "<tr>";

                for($j=0; $j<mysqli_num_fields($result); $j++) {

                        echo "<td>$row[$j]</td>";

                }

                echo "</tr>";

        }

        echo "</table>";

        mysql_close($db_link);

?>

翻轉工作室:粘添壽

 

course_db 關聯圖

資料庫程式設計:

 

 

 

翻轉電子書系列: