資料庫程式設計 – PHP+MySQL 第 九章 混合查詢程式  上一頁      下一頁

 

9-4 暫存表格運用

內容:

  • 9-4-1 暫存資料表的運用

  • 9-4-2 範例研討:查詢學生修課成績

9-4-1 暫存資料表的運用

混合查詢是『子查詢』與『合併查詢』的整合運用,但吾人發現其中最大困難是合併後的『動態資料表』,必須立即連接子查詢或與其他資料表(或動態資料表)合併,有時候真的很難連結。如果我們能產生暫時資料表,再將查詢後的動態資料表儲存起來,對於查詢語句就會比較好編寫,尤其在資料庫程式設計方面就會簡單許多。當查詢運作完成後,再將這些暫存資料表刪除即可。

如下圖所示,首先產生 temp1 temp2 兩表格,將 table_1 table_2 合併或巢狀查詢結果存入 temp1,再將 temp1 table_3 查詢結果存入 temp2 ,最後 temp2 table_4 查詢所要的訊息之後,再將 temp1 temp2 刪除。

9-4-2 範例研討:查詢學生修課成績

(A) 程式功能:Ex8_7

請製作一只可依學號查詢該生這學期修讀了幾門課,印出課程名稱、必選修、學分數與成績。『表單網頁』如下:

『執行網頁』的結果如下:

(B) SQL 系統分析:

此題目很困難利用巢狀查詢得到結果,利用合併查詢會造成系統負荷增加,雖然利用混合查詢可減少系統負擔,但缺點是必須及時連結臨時表格。如果我們產生一些暫存資料表來承接臨時表格的結果,就能解決此問題。如下圖步驟如下:

1.        利用學號由 select_course 表查出該生這學期修課之 {open_course_ID, final} 並存入 temp1 表內。

2.        temp1 open_course 表合併,並篩選 A.open_course_ID = B.open_course_ID,取出 {course_ID, final} 再存入 temp2 表。

3.        temp2 all_course 表合併,並篩選 C.course_ID = D.course_ID,取出 {course_name, required, credit, final} 之結果。

4.        刪除 temp1 temp2 暫存表。

SQL 程式設計如下:

 create table temp1 as

       select open_course_ID, final

       from select_course

       where student_ID = "90211302";

      

create table temp2 as

       select A.course_ID, B.final

       from open_course as A, temp1 as B

       where A.open_course_ID = B.open_course_ID;

 

select course_name, final

from temp2 as C, all_course as D

where C.course_ID = D.course_ID;

 

drop table temp1, temp2;

(C) 網頁製作技巧:

我們將上圖的 SQL 系統分析,設計網頁如下:

(D) 表單網頁程式範例:Ex9_5-form.php

僅製作一只可以直接輸入學號之表單即可,如下:

1

2

3

4

5

6

7

8

9

<?php

   echo "<p><font size='3'> 查詢學生修課及成績 </font></p>";

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

                echo "請輸入學號:<input name = 'student_ID' type = 'text' <BR>";

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

        echo "</form>";

?>

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

依照上述 SQL 系統分析,程式如下:

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

33

34

35

36

37

38

39

40

41

42

<?php

        $student_ID = $_POST["student_ID"];

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

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

        // 步驟 1 產生 temp1

    $sql_query = "create table temp1 as

                                   select open_course_ID, final

                                   from select_course

                                   where student_ID = '$student_ID'";

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

        // 步驟 2 產生 temp2

        $sql_query = "create table temp2 as

                                        select A.course_ID, B.final

                                        from open_course as A, temp1 as B

                                        where A.open_course_ID = B.open_course_ID";

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

        // 步驟 3 查詢出結果

        $sql_query = "select course_name, final

                from temp2 as C, all_course as D

                where C.course_ID = D.course_ID";

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

        // 刪除 temp1, temp2

        $sql_query = "drop table temp1, temp2";

        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 關聯圖

 

資料庫程式設計 - PHP+MySQL: