連鎖した関連テーブル
ユーザーが特定の都市に住み、 その都市が異なる国に位置しているとします。 この場合、データを保存するには 3つのテーブルが必要になります: ユーザーは都市と関連付けられ、 都市は国と関連付けられます。この場合、 ユーザーと国を直接関連付けるフィールドは不要です。 なぜなら、ユーザーは都市と国の関連付けを通じて 間接的に国と関連付けられるからです。
テーブルを見てみましょう。国のテーブル:
| id | name |
|---|---|
| 1 | country1 |
| 2 | country2 |
都市のテーブル:
| id | name | country_id |
|---|---|---|
| 1 | city1 | 1 |
| 2 | city2 | 1 |
| 3 | city3 | 2 |
ユーザーのテーブルは変更ありません:
| id | name | city_id |
|---|---|---|
| 1 | user1 | 1 |
| 2 | user2 | 1 |
| 3 | user3 | 2 |
| 4 | user4 | 1 |
| 5 | user5 | 3 |
| 6 | user6 | 2 |
クエリ
ユーザーをその都市や国と一緒に取得するには、 2つのJOINを行う必要があります: 1つ目はユーザーに都市を結合し、 2つ目は都市に国を結合します:
SELECT
users.name,
cities.name as city_name,
countries.name as country_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
LEFT JOIN countries ON countries.id=cities.country_id
実践問題
商品が特定のサブカテゴリに属し、 サブカテゴリが特定のカテゴリに属しているとします。 保存するデータ構造を説明してください。
商品をそのサブカテゴリやカテゴリと一緒に 取得するクエリを書いてください。
サブカテゴリをそのカテゴリと一緒に 取得するクエリを書いてください。