2011-11-07 16 views
1

同じMySQLテーブルで複数の結合を試みていますが、期待した結果が得られません。うまくいけば、誰かが私の間違いを指摘できます。私はここでMySQLクエリで別のテーブルから複数回結合する

user1 | cat | mouse | snake | 
user2 | mouse | snake | dog | 
..etc 

の出力を見たい

Table 1 - cpe Table 

|id | name 
|---------- 
| 1 | cat 
| 2 | dog 
| 3 | mouse 
| 4 | snake 
----------- 

Table 2 - AutoSelect 

|id | name | cpe1_id | cpe2_id | cpe3_id | 
|----------------------------------------------- 
| 1 | user1 | 1  | 3  | 4  | 
| 2 | user2 | 3  | 1  | 2  | 
| 3 | user3 | 3  | 3  | 2  | 
| 4 | user4 | 4  | 2  | 1  | 
------------------------------------------------ 

は私が空白の結果を得る

SELECT * FROM AutoSelect 
LEFT JOIN cpe ON 
(cpe.id = AutoSelect.cpe1_id) AND 
(cpe.id = AutoSelect.cpe2_id) AND 
(cpe.id = AutoSelect.cpe3_id) 

を試してきたものです。私はこれらの結合を行う方法を知っていると思っていましたが、明らかにcpe?_idとcpeテーブルの名前を一致させようとしています。

ありがとうございました。

+0

あなたは出力がuser2のあるべきよろしいです - 「マウスヘビ犬」ではなく「マウス猫犬」? – xoid

答えて

1

3回も参加する必要があります。現在のところ、あなたのクエリは、結合についての3つのcritieriaで1回だけ結合します。これは、実行する必要があります。

SELECT a.name, cpe1.name, cpe2.name, cpe3.name FROM AutoSelect as a 
LEFT JOIN cpe as cpe1 ON (cpe1.id = a.cpe1_id) 
LEFT JOIN cpe as cpe2 ON (cpe2.id = a.cpe2_id) 
LEFT JOIN cpe as cpe3 ON (cpe3.id = a.cpe3_id) 

そして、あなたはおそらくINNERに意味はNULL値があなたの自動選択テーブルで許可されていない限り、LEFT JOINをするのではなく、JOIN。

0

あなたのデザインは間違っていると思います。 、

選択u.name、ユーザu、動物aからa.name:次に

table 1 : animal 
id name 
1 cat 
2 dog 
3 mouse 
4 snake 


table 2 : user 
|id | name | 
|-------------- 
| 1 | user1 | 
| 2 | user2 | 
| 3 | user3 | 
| 4 | user4 | 

table 3 : association 
|id_user | id_animal| 
|-------------------- 
| 1  | 1  | 
| 1  | 3  | 
| 1  | 4  | 
| 2  | 3  | 
| 2  | 1  | 
| 2  | 2  | 
| 3  | 3  | 
| 3  | 2   
| 4  | 4  | 
| 4  | 2  | 
| 4  | 1  | 
--------------------- 

:そのようなテーブルと

は、あなたはそれリレーショナルデータベースであることを意味しています方法を取得しますassociation assここで、ass.user_id = u.idおよびass.animal_id = a.id;

+1

はい、ジェロームg、あなたは正しいです。デザインが間違っています。私はYiiのために構築されたデータベースと多数のテーブルの責任を取得しました。私が掲示したものは、テーブル内の列に含まれるもののわずか1/8です。私は「動物」で短くしようとする。 :)

残念なことに、私が行かなくても、多くのページを変更することなく、データを取り出すためにこのテーブルに対してクエリを実行する必要があります。結合は苦痛になるだろう。回答いただきありがとうございます、私は両方のアイデアをテストするつもりです!戻る – Geo99M6Z

0

この場合、ソリューションは優れた動的データベースを生成しません。複数のテーブルを組み合わせる方法は他にもあります。私は自分のデータベースによって、あなたが使用すべきもの、そしていつこのソリューションを使うべきかを示すことができます。スキームはオランダ語ですが、おそらくキーワードを理解するでしょう。

あなたのように、私は風車のエネルギー生産を測定しなければならないkWhメーターと風力発電機を組み合わせなければなりませんでした。あなたがすべきことは、この場合、別のテーブルを作ることです(私のケースでは、molenkWhlink)。テーブルがINNODBタイプ(外部キーを作成するためのもの)であることを確認してください。私がやったことは、新しいテーブルにIDのポインタ(外字キー)(オランダ語Volgnummer)を入れてメーターとミルを組み合わせることです。あなたが必要としない利点はありますが、確かにそうでした。リンクやリンク解除時にタイムスタンプやメータ値などの接続と切断情報を使って余分なテーブルを拡張することができたという事実です。これにより、データベースがよりダイナミックになります。

私のケースでは、私もmeassurements(metingoverzicht)用のテーブルを持っていました。このスキームでわかるように、私はMetingoverzichtからmolenkwhlinkに行く2行を持っています。この理由は非常に簡単です。私が取るすべての安楽死は、テーブルMetingoverzichtに保存されます。 (スケジュールされている)毎日のメザメントには特別なブール値が設定されますが、スケジュールされていないメザメントもここで保存され、ボールドライトはオフになります。メーターを切り替えるとき、私は出発メーターの終点値と新しいメーターのスタート値を必要とし、今日の始動の価値を計算する必要があります。これはあなたのソリューションが来る場所で、追加のテーブルは動作しません。通常、別のテーブルから値が1つだけ必要な場合は、JOINが使用されます。この場合の問題は、1つのリンクに2つのmeassurementIDがあることです(接続用に1つ、切断用に1つ)。彼らは両方とも同じタイプの情報を保持する必要があるため、両方とも同じテーブル列を指しています。つまり、あるテーブルから別のテーブルへの二重JOINを使用することができます。なぜなら、両方の値は1回だけ使用され、1つのアクションが異なる場所に保存されるのを避けるために別の場所に保存する必要があるため、常に避ける必要があります。

http://s1101.photobucket.com/user/Manuel_Barcelona/media/schemedatabase.jpg.html

関連する問題