2011-01-26 13 views
10


を複数の値を格納することを説明する時本当に悪いイムと私も
[OK]をみんなは私がすでに持っているこの問題
を持ってこの問題のために適切なタイトルを知りません1人のテーブル名mealMysqlの、私と一緒にクマ別のテーブルから1列に

+------+--------+-----------+---------+ 
| id | name | serving | price | 
+------+--------+-----------+---------+ 
| 1 | soup1 | 2 person | 12.50 | 
+------+--------+-----------+---------+ 
| 2 | soup2 | 2 person | 15.50 | 
+------+--------+-----------+---------+ 
| 3 | soup3 | 2 person | 23.00 | 
+------+--------+-----------+---------+ 
| 4 | drink1 | 2 person | 4.50 | 
+------+--------+-----------+---------+ 
| 5 | drink2 | 2 person | 3.50 | 
+------+--------+-----------+---------+ 
| 6 | drink3 | 2 person | 5.50 | 
+------+--------+-----------+---------+ 
| 7 | frui1 | 2 person | 3.00 | 
+------+--------+-----------+---------+ 
| 8 | fruit2 | 2 person | 3.50 | 
+------+--------+-----------+---------+ 
| 9 | fruit3 | 2 person | 4.50 | 
+------+--------+-----------+---------+ 

[OK]を、今私は、管理者がこのmealテーブル
からコンボ食事を作成できるようにしたいだから平均、コンボ食事は食事

無制限の数のamoutをを持つことができます

保存する方法を現在イムパズル/私はmeal_id列で

+------+--------------+-----------+-----------+ 
| id | combo_name | serving | meal_id | 
+------+--------------+-----------+-----------+ 
| 1 | combo1  | 2 person | 1,4,7,9 | 
+------+--------------+-----------+-----------+ 
| 2 | combo2  | 2 person | 2,5,8 | 
+------+--------------+-----------+-----------+ 
| 4 | combo3  | 2 person | 3,5,6,9 | 
+------+--------------+-----------+-----------+ 

ルックの下に、私は、データを格納するための良い方法であると思ういけないLKE何かを保存したいdonw食事 へのリンクコンボミール

答えて

19

多対多のリンクテーブルを作成します。

combo_id meal_id 
1   1 
1   4 
1   7 
1   9 
2   2 
2   5 
2   8 
3   3 
3   5 
3   6 
3   9 

与えられたコンボのためのすべての食事を選択するには:

SELECT m.* 
FROM combo_meal cm 
JOIN meal m 
ON  m.id = cm.meal_id 
WHERE cm.combo_id = 1 
+0

これは正しい方法です –

+0

thanx four答え – slier

+0

データを取得する間に、複数の値を取得するためにその文字列を処理できる質問者の構造と比較して、処理するサイクルが増えます。私もこれで混乱している! –

4

いいえ、間違いなくデータを保存するには適していません。 combo_headerテーブルとcombo_detailsテーブルを使用する方がよいでしょう。

combo_headerのようなものになります。

+------+--------------+-----------+ 
| id | combo_name | serving | 
+------+--------------+-----------+ 
| 1 | combo1  | 2 person | 
+------+--------------+-----------+ 
| 2 | combo2  | 2 person | 
+------+--------------+-----------+ 
| 4 | combo3  | 2 person | 
+------+--------------+-----------+ 

そして、combo_detailsのようなものになります:あなたが最初に通常に違反している単一の列に複数の値を使用することにより、ちなみに

+------+-----------+ 
| id | meal_id | 
+------+-----------+ 
| 1 | 1  | 
+------+-----------+ 
| 1 | 4  | 
+------+-----------+ 
| 1 | 7  | 
+------+-----------+ 
| 1 | 9  | 
+------+-----------+ 
.../you get the idea! 

リレーショナルデータベースの形式

私が提案している方法は、のような質問に答えることができます。combo1の食事の名前はすべてと非常に簡単です。

1

これは、食事とコンボの多対多の関係と呼ばれています。食事は複数のコンボで表示することができ、コンボは複数の食事を含むことができます。可能なすべての食事 - コンボペアを含むリンクテーブル(combo.meal_idフィールドではなく)が必要です。

  1. 食事(meal_id、サービス提供、名)(サービングcombo_id、名前)
  2. コンボ
  3. meal_combo(AUTOID、meal_id、combo_id):

    最後に、あなたは、3つのテーブルを持っています

meal_combo.autoidは厳密には必要ではありませんが、一般的な推奨事項です。

はそれにすべてのそれの食事と一緒にコンボを一覧表示するには:

SELECT meal.id, meal.name FROM comboINNER JOIN meal_combo ON meal_combo.combo_id = combo.id INNER JOIN meal ON meal.id = meal_combo.meal_id WHERE combo.id = 132

グーグルの詳細については、「多対多の関係」や「データベース・リンクテーブル」のため。

+0

私は個人的には、それが男の子として初めて使用されたときに無限の力の知恵を感じた... –

+0

http://explainextended.com/2009/06/21/click/ – Quassnoi

関連する問題