2011-02-01 3 views
0

こんにちは、以下のようなことが可能かどうか疑問に思っています。明らかに私はphpMyAdminでこれを実行しようとしましたが、エラーがあります。おそらく、このクエリを書く別の方法があります。MySQL ON列に結合する(列b)

SELECT * FROM eat_eat_restaurants AS r 
INNER JOIN eat_eat_cuisines AS c ON c.cuisine_id IN (r.cuisine_ids) 

これに加えて、レストラン名と料理を1行で選択することは可能ですか?例えば

r_name c_names 
Marco's Italian, Modern European 

私の2つのテーブルがそうのようになります。

TABLE EAT_EAT_RESTAURANTS 
id r_name cuisine_ids 
1 Marco's 1,2 
2 Beldaro 3,4 
3 Benny's 1,3 


TABLE EAT_EAT_CUISINES 
id c_name 
1 Italian 
2 Modern European 
3 Greek 
4 Belgian 
5 ... 
+3

あなたは、カンマ区切りのリストとして 'cuisine_ids'を格納することで足に自分自身を撃ちました。このようなm対n関係には中間テーブルを使用する必要があります。あなたの質問の2番目の部分:GROUP_CONCAT() – Mchl

+0

ありがとう、まだ足の中で撮影されていない、まだ設計プロセスで - あなたの助けを喜んでstackoverflowに! – Martin

+0

ああ。トリガーを引っ張る前にどちらの側を指すべきかを尋ねる人にはうれしいです:D – Mchl

答えて

2

現在のスキーマは正規化されておらず、非常に非効率です。 3つのテーブル試してみてください:restaurantscuisinesrestaurant_cuisinesをし、このようなクエリを実行します。私はあなたのクエリが簡単になり、結合テーブルを使用することをお勧めします他の解決策として

SELECT r.r_name, GROUP_CONCAT(c.c_name) 
FROM restaurants r JOIN restaurant_cuisines rc ON (r.id=rc.r_id) 
JOIN cuisines c ON (rc.c_id=c.id) 
GROUP BY r.r_name; 
+0

私はこれをしてくれてありがとう、ありがとう。 rs.r_id - > rc.r_idとrs.c_id - > rc.c_idの将来の訪問者の利益のために、あなたの答えに誤りを修正してください。とても有難い! – Martin

+0

@マーティン:助けてくれてうれしいです。私はエラーを修正しました。 – dnagirl

1

をなし、構文はそのように動作しません。

料理が複数のレストランに属し、レストランが複数の料理を提供するため、レストランと料理の間にクロステーブルを作成する必要があります。その後、3つのテーブルを一緒にして、レストランの名前だけでなく、彼らが提供する料理のすべての名前を取得することができます。

クロステーブルは、このようなフィールドを有するであろう:

id restaurant_id cuisine_id 
1 1    1 
2 1    2 
3 2    1 
4 2    3 
5 4    1 
1

第3テーブルが必要です

 
TABLE EAT_EAT_CUISINES_LOOKUP 
r_id cuisine_ids 1 
1  1 
1  2 
// for Marco 

は次、それに参加するのであれば1行に必要な使用GROUP_CONCATにおける結果()

0

。 のは、それを名前を付けてみましょう:restaurant_cuisine 例:

Id restaurant_id cuisine_id 
1  1   1 
1  1   2 
関連する問題