2012-04-26 16 views
0

この質問を1つの文にまとめるのは難しいです。私は2つのテーブルを持っています - そのうちの1つは、外部フィードによって自動的かつ定期的に更新されます。 2番目の表には、2番目の表の一部の行に固有のキーで識別される追加情報があります。ここに例があります:SELECTで2つのテーブルを1つにまとめるにはどうすればよいですか?

 
Table1 
    id: int PRIMARY KEY 
    channel: varchar(255) UNIQUE KEY 
    name: varchar(255) NOT NULL 
    verified: tinyint(1) NOT NULL 

Table2 
    id: int PRIMARY KEY 
    channel: varchar(255) UNIQUE KEY 
    extra_info: varchar(255) 

表1はメインテーブルです。これは実際に選択されているテーブルです。 Table2にあるフィールド(IDとチャンネル以外)を選択時にTable1に移動すると、Table1にあるTable2のすべての行が選択時にマージされるようになります。

は例えば、私はこの2つのテーブル内の情報は、私は続行する最速の方法は何であるか思ったんだけど、この

[{ 
    "id": 5, 
    "channel": "bkids2", 
    "name": "Bkid", 
    "verified": true, 
    "extra_info": "Some extra information added using Table2" 
}, 
... 
] 

のようなJSON出力として終わるしたいです。私はこれをすぐに SQL構文を使用して行うことはできますか?いくつかの種類のクエリは非常に遅いので、両方のテーブルのすべてのデータをフェッチし、サーバー側のプログラミング言語を使用してマージを行うほうが速いのはおそらくでしょうか?

私は前者が正解であると仮定して半分です。この場合、MySQLを使用してこれを行うにはどうすればよいですか?サブクエリ?結合?連合?

私は、これらのテクノロジーのどちらが機能しているか、どれくらい速く/遅く動作しているかを完全に理解していないことを認めなければなりません。

答えて

1

これを試してみてください:

SELECT Table1.*, IFNULL(Table2.extra_info, 'DefaultValue') as extra_info 
FROM Table1 LEFT OUTER JOIN Table2 
ON Table1.id = Table2.id 
+0

これはほぼ完全に動作しますが、行が見つからない場合はtable2の列をデフォルト値に設定する方法はありますか?たとえば、table2に一致する行が見つからなかったために 'extra_info'カラムをテーブルに埋め込むことができなかった場合は、それを文字列「{}」や数字などに設定しますか? – Hubro

+0

私は 'IFNULL(Table2.extra_info、 'DefaultValue')をextra_infoとして追加して答えを編集しました。 –

+0

優秀、ありがとう – Hubro

0

あなたは所望の出力を得るためにクエリを記述することができます。

SELECT id, channel, name, verified, extra_info FROM table_1 NATURAL JOIN table_2 

このクエリはテーブルを結合し、両方の結果を共通に表示します。 これはあなたの質問に対する答えです。

+0

@codemonkey:これは答えかどうかにかかわらず、目を覚ましていますか。 – Addicted

+0

私は起きています。私はこの質問をして仕事に出た。私は家に帰るときにあなたの提案を確かに試してみましょう:-)この解決策を@ aziz-shaikhの答えとは異なるものにする理由を説明できますか?長所短所? – Hubro

+0

私は彼が1列に基づいて2つのテーブルを結合しているのを見ることができます。 と私は2つのテーブルの完全一致に基づいて結果を表示しています(これは逆正規化のようです) – Addicted

関連する問題