資料庫程式設計 – PHP+MySQL 第六章 巢狀查詢程式  上一頁      

翻轉工作室:粘添壽     course_db E-R 關聯圖 <開啟>

 

6-3 子查詢 in 連結

6-3-1 In 連結語法

當子查詢的結果超過一個的時候,則需用 in 連結,基本語法如下:

Select  欄位_1, 欄位_2, ..               // 父查詢敘述

From 資料表_1

Where 欄位 in (select item               // 子查詢敘述

              From 資料表_2

              Where 條件敘述);

譬如,子查詢的結果有 3 (ABC),則一個(A)接一個(B)進入父查詢執行,總共執行 3 次。

 

6-3-2 範例研討:查詢選課名單

(A) 系統需求:Ex6_5

請製作一個可以用開課編號,查詢修該課程學生的名冊,期望查詢網頁如下:

查詢結果的網頁如下:

(B) 系統分析

學生修課與成績都登錄於 select_course 資料表內,我們先篩選出該課程修課同學(取得 student_ID),再利用student_ID students 資料表內篩選出學生資料,但修該門課的同學不止一位,因此需要用 in 連結。

(C) SQL 語法:(查詢開課代碼 = 1)

SELECT *

from students

where student_ID in (select student_ID

                 from select_course

                 where open_course_ID = "1");

 

(D) 查詢網頁:Ex6_5-form.php

系統要求使用下拉式選單,我們開啟 open_course 資料表,並選擇 open_course_ID 做成選單方式,如下:

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

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>查詢選課名單</title>

</head>

<body>

<?php

             $db_link = mysql_connect("localhost", "root", "123456")

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

       $select_db = mysql_select_db("course_db");

            $sql_query = "select open_course_ID

                from open_course";

             mysql_query("SET NAMES 'utf8'");

             $result = mysql_query($sql_query);

?>

   <p><font size="3"> 以開課編號查詢選課名單 </font></p>

   <form name="表單" method="post" action="Ex6_5-action.php">

               

<?php

           echo "選擇開課編號:";

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

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

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

                     }

            echo "</select>";

            echo "<BR><BR>";  

            mysql_close($db_link);

?>

      <input type="submit" value="送出">

   </form>

</body>

</html>

(F) 執行網頁的範例:Ex6_5-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

<! filename: Ex6_5-action.php>

<?php

             $open_course_ID = $_POST["open_course_ID"];     

       $db_link = mysql_connect("localhost", "root", "123456")

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

             $select_db = mysql_select_db("course_db");

             $sql_query = "SELECT *

                                 FROM students

                                 WHERE student_ID IN (SELECT student_ID

                                                             FROM select_course

                                                      WHERE open_course_ID ='$open_course_ID')";

              mysql_query("SET NAMES 'utf8'");

              $result = mysql_query($sql_query);

       

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

      for($i=0; $i<mysql_num_fields($result); $i++) {

            echo "<td>".mysql_field_name($result, $i)."</td>";

       }

               echo "</tr>";

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

                   echo "<tr>";

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

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

          }

          echo "<tr/>";

       }

       mysql_close($db_link);

?>

 

6-3-3 範例研討:查詢系所開課

(A) 系統需求:Ex6_6

請製作一個可以查詢某一系這學期開了哪些課程(僅列出代碼)。期望查詢網頁如下:

查詢結果的網頁如下:

(B) 系統分析

全校這學期所開的課全部登錄在 open_course 資料表內,對於開課情況有些混亂。譬如,某一系的老師不一定僅在該系開課,也許會被邀請到其他系開課。另外,同一門課也可能在不同班級開課,也不一定是同一老師開課。因此,open_course 僅記錄哪一位老師(teacher_ID)、開哪一門課(course_ID)、以及課開在哪一班(class_ID),並沒有記錄開在哪一系。照理講,我們僅將 teacher_IDclass_ID course_ID 三個欄位可組合一個主鍵(Primary key),但為了方便操作,還是多增加一個 open_course_ID 欄位為主鍵,並將它設定為自動增加數字,但不可重複。

系統要求某一系的老師開了哪些課,因此,我們必須由department 表內查詢到該系的識別碼 (dep_ID),再利用 dep_ID teachers 表查詢到該系有哪些老師(超過一位),再由這些老師的 teacher_ID 查詢 open_course 表內所開的課程,因為超過一位老師,因此需要用『=』連結,如下圖所示:

(C) SQL 語法:(查資訊管理系所開的課程)

SELECT *

from open_course as A

where teacher_ID in (select teacher_ID

                  from teachers

                  where  Dep_ID = (select Dep_ID

                                  from department

                                  where dep_name = "資訊管理系"));

 

(D) 查詢網頁:Ex6_6-form.php

系統要求用下拉式選單,因此,我們開啟 department 資料表 select 選項,但傳遞選擇系別名稱的 dep_ID,處理網頁就可以減少一個步驟,程式範例如下:

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

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>查詢選課名單</title>

</head>

<body>

<?php

        $db_link = mysql_connect("localhost", "root", "123456")

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

        $select_db = mysql_select_db("course_db");

        $sql_query = "select dep_ID, dep_name

                      from department";

        mysql_query("SET NAMES 'utf8'");

        $result = mysql_query($sql_query);

?>

   <p><font size="3"> 查詢系所開課清冊(僅列出代碼) </font></p>

   <form name="表單" method="post" action="Ex6_6-action.php">

              

<?php

       echo "選擇系所名稱:";

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

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

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

}

       echo "</select>";

       echo "<BR><BR>";  

       mysql_close($db_link);

?>

   <input type="submit" value="送出">

   </form>

</body>

</html>

(F) 執行結果的網頁:Ex6_6-action.php

接收查詢網頁所傳遞的系別代碼($dep_ID)後,則利用它查詢有哪些老師,每位老師開了哪些課,範例如下:

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

<!filename:Ex6_6-action.php>

<?php

        $dep_ID = $_POST["dep_ID"]; 

        $db_link = mysql_connect("localhost", "root", "123456")

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

        $select_db = mysql_select_db("course_db");

        $sql_query = "SELECT *

                        from open_course as A

                        where teacher_ID in (select teacher_ID

                              from teachers

                              where  Dep_ID = $dep_ID)";

        mysql_query("SET NAMES 'utf8'");

        $result = mysql_query($sql_query);

       

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

        for($i=0; $i<mysql_num_fields($result); $i++) {

                echo "<td>".mysql_fetch_field($result, $i)->name."</td>";

        }

        echo "</tr>";

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

                echo "<tr>";

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

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

                }

                echo "<tr/>";

        }

        mysql_close($db_link);

?>

 

6-3-4 自我挑戰:查詢系所老師的開課課程

(A) 系統需求:PM6_4

請製作一個可以查詢某一系這學期開了哪些課程(列出課程名稱,與相關資料)。期望查詢網頁如下:

查詢結果的網頁如下:

(B) 系統分析

這是 Ex6_6 的延伸,假如我僅希望知道開課內容,而不用知道它是開在哪一班或哪一位老師授課,則這個題目就能滿足。如果還要知道開在哪一班的班級名稱,可還要動腦筋才能做到(爾後有範例)。延伸 Ex6_6 得到了所開課的課程代碼 (course_ID),再利用它由 all_course (課程資料表)內查詢到該課程的相關資料,但它不僅一個,所以要用in 連結。

(C) SQL 語法:(查資訊管理系所開的課程)

Select *

Form all_course

Where course_ID IN (

SELECT course_ID

from open_course as A

where teacher_ID in (

select teacher_ID

                   from teachers

                   where Dep_ID = (

select Dep_ID

                        from department

                        where dep_name = "資訊管理系"));

 

(D) 查詢傳送網頁:PM6_4-form.php ( Ex6_6-form.php 相同)

 

(E) 接收與處理網頁:PM6_4-action.php (重點提示)

1

2

3

4

5

6

7

8

9

10

11

12

13

….

   $sql_query = "select *

                        from all_course

                        Where course_ID in (

                                SELECT course_ID

                                from open_course as A

                                where teacher_ID in (

                                        select teacher_ID

                                          from teachers

                                         where dep_ID = $dep_ID))";

       

        $result = mysql_query($sql_query);

 ….

<GOTOP>