首頁 > 後端開發 > PHP問題 > 如何使用PHP進行一對多關聯查詢

如何使用PHP進行一對多關聯查詢

PHPz
發布: 2023-04-19 10:47:01
原創
969 人瀏覽過

在使用PHP進行資料庫操作時,經常需要進行一對多關聯查詢。這種查詢可以將一張表中的一條資料關聯到另一個表中的多個資料。在PHP中,一對多重關聯查詢通常會得到一個二維數組,其中每個元素代表一個主表記錄,對應的值則是多張關聯表中的記錄。

本文將介紹如何使用PHP進行一對多關聯查詢,並得到一個二維陣列的結果。

一、什麼是一對多關聯查詢?

在資料庫中,如果兩個表之間存在一個主外鍵關係,那麼就可以進行一對多關聯查詢。在這種關係中,一張表中的一筆記錄對應多張另一個表中的記錄。

例如,設有一個“學生表”和一個“成績表”,在“學生表”中每個學生對應多個“成績表”中的記錄。這種關係可以使用主鍵和外鍵進行綁定,如下所示:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) DEFAULT NULL,
  `score` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `student_id` (`student_id`),
  CONSTRAINT `score_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
登入後複製

在「學生表」中,每筆記錄包括一個唯一識別碼ID和一個名稱NAME。在「成績表」中,每筆記錄包括一個同樣的唯一識別碼ID和一個對應的STUDENT_ID,代表該記錄屬於哪個學生;此外還有一個SCORE字段,代表該學生的成績。

二、如何進行一對多關聯查詢?

在PHP中,可以透過使用JOIN關鍵字進行一對多關聯查詢。 JOIN是SQL中的關鍵字,用於將兩個或多個表中相同的列連接在一起,並產生一個大的表。

在上面的範例中,如果想要將學生表和成績表關聯起來,可以使用如下的SQL語句:

SELECT student.*, score.score
FROM student
LEFT JOIN score ON student.id = score.student_id;
登入後複製

這個語句中,先選擇學生表中的所有字段,然後透過LEFT JOIN和ON關鍵字將成績表和學生表連接起來。連結的條件是學生表中的ID欄位等於成績表中的STUDENT_ID欄位。最後,透過SELECT語句選擇需要顯示的列,並得到一個二維數組的結果。

在PHP的PDO物件中,可以使用query方法執行上面的SQL語句,並使用fetchAll方法得到一個二維陣列的結果:

$db = new PDO('mysql:host=localhost;dbname=mydb', 'myuser', 'mypassword');
$stmt = $db->query('SELECT student.*, score.score
                    FROM student
                    LEFT JOIN score ON student.id = score.student_id');
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
登入後複製

在上面的程式碼中,先創建了一個PDO對象,然後使用query方法執行SQL語句,最後使用fetchAll方法得到結果。

三、如何將一對多關聯查詢結果處理成二維陣列?

當進行一對多關聯查詢時,需要將多個表中的資料組合成一個二維陣列的結果。這個二維數組的每個元素都代表著一個主表的記錄,而對應的值則是多個關聯表中的記錄。

以下是一種將一對多關聯查詢結果處理成二維數組的方法:

$data = array();
foreach ($result as $row) {
    $id = $row['id'];
    if (!isset($data[$id])) {
        $data[$id] = $row;
        $data[$id]['scores'] = array();
    }
    if (!empty($row['score'])) {
        $data[$id]['scores'][] = $row['score'];
    }
}
登入後複製

在上面的程式碼中,首先建立一個空數組$data,它將作為最終的二維數組結果。然後使用foreach循環遍歷查詢結果中的每一筆記錄,將每筆記錄的主鍵ID保存在$id變數中。

接下來,檢查$data數組中是否已經存在一個主鍵為$id的元素。如果不存在,則將該元素插入到$data數組中,並建立​​一個名為「scores」的空數組,用於保存與該主鍵相關的所有記錄。如果已經存在,則不需要插入,直接使用已經存在的元素。

在遍歷記錄時,如果發現了一個「成績表」中的記錄,將該記錄的SCORE欄位加入到scores陣列中。由於一個主表記錄對應多個關聯表記錄,所以scores數組需要作為一個二維數組進行保存。

當迴圈結束時,$data數組中就保存了最終的二維數組結果。每個元素代表一個主表記錄,對應的值則是關聯表中的多個記錄。

四、例子

下面是一個完整的例子,示範如何進行一對多關聯查詢,並處理結果為一個二維數組:

$db = new PDO('mysql:host=localhost;dbname=mydb', 'myuser', 'mypassword');
$stmt = $db->query('SELECT student.*, score.score
                    FROM student
                    LEFT JOIN score ON student.id = score.student_id');
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

$data = array();
foreach ($result as $row) {
    $id = $row['id'];
    if (!isset($data[$id])) {
        $data[$id] = $row;
        $data[$id]['scores'] = array();
    }
    if (!empty($row['score'])) {
        $data[$id]['scores'][] = $row['score'];
    }
}

print_r($data);
登入後複製

在上面的範例中,先建立一個PDO對象,並使用query方法執行SQL語句。然後再使用fetchAll方法得到查詢結果。

接下來,使用foreach循環遍歷查詢結果中的每一筆記錄,並將其處理為一個二維數組。最後使用print_r函數輸出結果。

五、結論

本文介紹如何在PHP中進行一對多關聯查詢,並將結果處理為一個二維陣列。在處理結果時,需要使用一個循環遍歷查詢結果,並將其轉換為二維數組的形式。處理完所有記錄後,就可以得到一個二維數組的結果,其中每個元素代表一個主表記錄,對應的值則是多個關聯表中的記錄。

以上是如何使用PHP進行一對多關聯查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板