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

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

Apr 19, 2023 am 10:05 AM

在使用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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)