PHPにおけるデータの親子関係

例えば、父親と息子の情報を保存する必要があるとしましょう。各父親は一人の息子しか持てず、 息子もまた一人の息子を持てるとします。

データの保存方法を考える必要があります。最初に思いつくアイデアは、 父親用の parents テーブルと息子用の sons テーブルの2つを作り、 これらを son_id や parent_id といったフィールドで関連付けることです。

しかし、この考え方はあまり良くありません。なぜなら、同じ人が父親であり息子でもある場合、 両方のテーブルに保存する必要があり、不便でスペースを無駄にし、エラーを引き起こしやすいからです。

より良い方法は、テーブルを自己結合することです。 users テーブルを作成し、 全てのユーザーを保存し、各ユーザーに son_id フィールドを設けて、 同じテーブル内の息子の id を保存します。

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

クエリ

では、ユーザーとその息子を一緒に取得するクエリを書いてみましょう。

まず、単純にユーザーを取得します。

sqlSELECT
  *
FROM
  users

次に、ユーザーにその息子を結合(JOIN)します。 テーブルを自己結合するため、エイリアス(別名)を付ける必要があります。

sqlLEFT JOIN users as sons

これで、メインテーブルとエイリアスを付けたテーブル間の関係を指定できます。

sqlLEFT JOIN users as sons ON sons.id=users.son_id

次に、フィールドを指定します。

sqlSELECT
  users.name as user_name, sons.name as son_name

全てをまとめると、次のようなクエリになります。

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

実践的な課題

Задание 1

カテゴリがあるとします。各カテゴリは親カテゴリに属することができ、 その親カテゴリもまた自身の親カテゴリに属することができ、以降同様です。 保存構造を設計してください。

Задание 2

カテゴリとその親カテゴリを一緒に取得するクエリを書いてください。

Задание 3

カテゴリとその親、さらにその親(祖カテゴリ)を一緒に取得するクエリを書いてください。

Задание 4

カテゴリとその親、祖カテゴリ、さらにその親(曾祖カテゴリ)を一緒に取得するクエリを書いてください。