それを実装する方法は、スキーマを「正規化」することです。スキーマの正規化を構成するいくつかの関連するアイデアがありますが、ここで重要なのは、データを 2 つのテーブルと 2 つのテーブル間の関係で表す必要があるということです。1 つの「Bar」に対して 1 つ以上の「Foo」があるため、この関係は「1 対多」と呼ばれます。
したがって、必要な手順は、一意の識別子列をスキーマに追加し (自動インクリメント整数を使用するのが最も簡単です)、JOIN
データを関連付けるメカニズムを使用してクエリを実行することです。
これが、MySQL (およびその他の多く) を「リレーショナル」データベースと呼ぶ理由です。
Bar
+----+----------+
| id | name |
+----+----------+
| 01 | fiz |
+----+----------+
| 02 | ghi |
+----+----------+
Foo
+----+--------+----------+
| id | bar_id | name |
+----+--------+----------+
| 01 | 01 | baz |
+----+--------+----------+
| 02 | 01 | car |
+----+--------+----------+
| 03 | 02 | abc |
+----+--------+----------+
| 04 | 03 | def |
+----+--------+----------+
Foo リレーションの「car」に基づいて「fiz」レコードを選択する結合は次のようになります。
SELECT
Bar.*
FROM Bar
JOIN Foo ON Bar.id = Foo.bar_id
WHERE Foo.name = "car"
そして、一致する Foo を持つ各バーの Foo リレーションの完全なリストが必要な場合:
SELECT
Bar.*,
GROUP_CONCAT(Foo.name)
FROM Bar
JOIN Foo ON Bar.id = Foo.bar_id
WHERE Foo.name = "car"
GROUP BY Bar.id