PHPにおけるデータの親子関係
例えば、父親と息子の情報を保存する必要があるとしましょう。各父親は一人の息子しか持てず、 息子もまた一人の息子を持てるとします。
データの保存方法を考える必要があります。最初に思いつくアイデアは、
父親用の parents テーブルと息子用の sons テーブルの2つを作り、
これらを son_id や parent_id といったフィールドで関連付けることです。
しかし、この考え方はあまり良くありません。なぜなら、同じ人が父親であり息子でもある場合、 両方のテーブルに保存する必要があり、不便でスペースを無駄にし、エラーを引き起こしやすいからです。
より良い方法は、テーブルを自己結合することです。 users テーブルを作成し、
全てのユーザーを保存し、各ユーザーに son_id フィールドを設けて、
同じテーブル内の息子の id を保存します。
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
クエリ
では、ユーザーとその息子を一緒に取得するクエリを書いてみましょう。
まず、単純にユーザーを取得します。
SELECT
*
FROM
users
次に、ユーザーにその息子を結合(JOIN)します。 テーブルを自己結合するため、エイリアス(別名)を付ける必要があります。
LEFT JOIN users as sons
これで、メインテーブルとエイリアスを付けたテーブル間の関係を指定できます。
LEFT JOIN users as sons ON sons.id=users.son_id
次に、フィールドを指定します。
SELECT
users.name as user_name, sons.name as son_name
全てをまとめると、次のようなクエリになります。
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
実践的な課題
カテゴリがあるとします。各カテゴリは親カテゴリに属することができ、 その親カテゴリもまた自身の親カテゴリに属することができ、以降同様です。 保存構造を設計してください。
カテゴリとその親カテゴリを一緒に取得するクエリを書いてください。
カテゴリとその親、さらにその親(祖カテゴリ)を一緒に取得するクエリを書いてください。
カテゴリとその親、祖カテゴリ、さらにその親(曾祖カテゴリ)を一緒に取得するクエリを書いてください。