ホームページ  >  記事  >  バックエンド開発  >  PHP を使用して 1 対多の相関クエリを実行する方法

PHP を使用して 1 対多の相関クエリを実行する方法

PHPz
PHPzオリジナル
2023-04-19 10:05:21922ブラウズ

PHP をデータベース操作に使用する場合、多くの場合、1 対多の相関クエリを実行する必要があります。この種のクエリでは、1 つのテーブルのデータを別のテーブルの複数のデータに関連付けることができます。 PHP では、1 対多のリレーショナル クエリは通常 2 次元配列になります。この配列では、各要素がメイン テーブル レコードを表し、対応する値が複数の関連テーブルのレコードになります。

この記事では、PHP を使用して 1 対多の関連クエリを実行し、2 次元配列の結果を取得する方法を紹介します。

1. 1 対多のリレーショナル クエリとは何ですか?

データベースでは、2 つのテーブル間に主キーと外部キーの関係がある場合、1 対多の関連付けクエリを実行できます。この関係では、1 つのテーブルの 1 つのレコードが別のテーブルの複数のレコードに対応します。

たとえば、「生徒テーブル」と「得点テーブル」があり、「生徒テーブル」の各生徒は複数の「得点テーブル」のレコードに対応しています。この関係は、以下に示すように、主キーと外部キーを使用してバインドできます。

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;

「Student Table」では、各レコードに一意の識別子 ID と名前 NAME が含まれます。 「スコア テーブル」では、各レコードには同じ一意の識別子 ID と、レコードがどの生徒に属しているかを表す対応する STUDENT_ID が含まれており、さらに、生徒のスコアを表す SCORE フィールドもあります。

2. 1 対多の相関クエリを実行するにはどうすればよいですか?

PHP では、JOIN キーワードを使用して 1 対多の関連クエリを実行できます。 JOIN は、2 つ以上のテーブルの同じ列を結合して大きなテーブルを生成するために使用される SQL のキーワードです。

上記の例で、student テーブルを成績テーブルに関連付ける場合は、次の SQL ステートメントを使用できます。

SELECT student.*, score.score
FROM student
LEFT JOIN score ON student.id = score.student_id;

このステートメントでは、最初に Student テーブルのすべてのフィールドを選択します。 table を作成し、LEFT JOIN および ON キーワードを使用してスコア テーブルと学生テーブルを接続します。接続の条件は、student テーブルの ID フィールドが成績テーブルの STUDENT_ID フィールドと等しいことです。最後に、SELECT ステートメントで表示する列を選択し、2 次元配列の結果を取得します。

PHP の PDO オブジェクトでは、クエリ メソッドを使用して上記の SQL ステートメントを実行し、fetchAll メソッドを使用して 2 次元配列の結果を取得できます。コードでは、最初に PDO オブジェクトを作成し、次に query メソッドを使用して SQL ステートメントを実行し、最後に fetchAll メソッドを使用して結果を取得します。

3. 1 対多の関連付けクエリ結果を 2 次元配列に処理するにはどうすればよいですか?

1 対多の関連付けクエリを実行する場合、複数のテーブルのデータを 2 次元配列の結果に結合する必要があります。この 2 次元配列の各要素はメイン テーブルのレコードを表し、対応する値は複数の関連テーブルのレコードになります。

以下は、1 対多の関連付けクエリ結果を 2 次元配列に処理する方法です:

$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 を作成します。 2 次元配列の最終的な結果として使用されます。次に、foreach ループを使用してクエリ結果の各レコードを走査し、各レコードの主キー ID を $id 変数に保存します。

次に、$data 配列に主キー $id を持つ要素が既に存在するかどうかを確認します。存在しない場合は、要素が $data 配列に挿入され、主キーに関連するすべてのレコードを保持するために「scores」という名前の空の配列が作成されます。すでに存在する場合は挿入する必要はなく、既存の要素が直接使用されます。

レコードを走査するときに、「スコア テーブル」内のレコードが見つかった場合は、そのレコードの SCORE フィールドをスコア配列に追加します。 1 つのメイン テーブル レコードは複数の関連テーブル レコードに対応するため、スコア配列は 2 次元配列として保存する必要があります。

ループが終了すると、最終的な 2 次元配列の結果が $data 配列に格納されます。各要素はメイン テーブル レコードを表し、対応する値は関連テーブル内の複数のレコードです。

4. 例

以下は、1 対多の関連付けクエリを実行し、結果を 2 次元配列に処理する方法を示す完全な例です。 ##上記の例では、まず PDO オブジェクトを作成し、クエリ メソッドを使用して SQL ステートメントを実行します。次に、fetchAll メソッドを使用してクエリ結果を取得します。

次に、foreach ループを使用してクエリ結果の各レコードを走査し、2 次元配列に処理します。最後に、print_r 関数を使用して結果を出力します。

5. 結論

この記事では、PHP で 1 対多の関連クエリを実行し、結果を 2 次元配列に処理する方法を紹介します。結果を処理するときは、ループを使用してクエリ結果を走査し、それらを 2 次元配列に変換する必要があります。すべてのレコードを処理した後、各要素がメイン テーブル レコードを表し、対応する値が複数の関連テーブルのレコードである 2 次元配列の結果を取得できます。

以上がPHP を使用して 1 対多の相関クエリを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。