0

MySQL データベースを使用して情報を保存するアプリケーションを PHP で作成しています。格納する必要がある情報の 1 つは名前の配列ですが、配列の長さは設定されていません。1 つから複数の項目に及ぶ場合があります。この配列を MySQL に保存し、配列から項目を 1 つだけ指定して取得できる方法はありますか?

たとえば、次のようなものをテーブルに保存できるようにしたいと考えています。

Foo        Bar
-------------------
[baz,car]  fiz
[abc,def]  ghi

次に、上記の表の最初の行だけcarを検索するように MySQL に指示できるようにしたいと考えています。SELECT

これを実装する実行可能な方法はありますか?

4

2 に答える 2

2

それを実装する方法は、スキーマを「正規化」することです。スキーマの正規化を構成するいくつかの関連するアイデアがありますが、ここで重要なのは、データを 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
于 2012-07-27T02:10:06.113 に答える
0

また

SELECT Bar FROM tbl
WHERE FIND_IN_SET('car', Foo)
于 2012-07-27T02:05:36.400 に答える