2017-03-07 8 views
-1

SQLで質問があります。SQL複数のテーブルを選択

私は3つのテーブル、メッセージ、支払い、レポートを持っています。

は、私は1つのクエリ内のすべてのテーブルから、ユーザからのすべてのイベントを取得したいので、これは私が取得したいワットです:

SELECT * FROM messages WHERE receiver_id = 10 
SELECT * FROM payments WHERE client_id = 10 
SELECT * FROM reports WHERE receiver_id = 10 

しかし、クエリ1インチ

これは可能ですか?

Table structures: 
- messages 
id 
sender_id 
receiver_id 
type 
text 
created_at 
updates_at 

- payments 
id 
user_id 
client_id 
method 
cost 
status 
text 
created_at 
updated_at 

- reports 
id 
sender_id 
receiver_id 
text 
created_at 
updates_at 
+0

3つのテーブルにすべての関係がある場合は、JOINSを使用します。 – Viki888

+2

テーブル構造、サンプルデータ、および予想される結果を表示してください。 – Jens

+0

この例では、receiver_idとclient_idの両方が10に等しい - これらの値がテーブル間の関係を形成すると想定するのは安全でしょうか? – RMathis

答えて

0

に関するいくつかの詳細を表示する必要がありそうで

SELECT * FROM messages as M, payments as P, reports as R 
WHERE M.receiver_id, P.client_id, R.receiver_id = 10 

を3つのテーブルを使用することができますUNION。これは、このような単純なことができます。これはあなたが興味のあるすべてのテーブル間の列の共通セットがあると仮定し

SELECT receiver_id as event_id, event_name, event_description, event_timestamp FROM messages WHERE receiver_id = 10 
UNION 
SELECT client_id as event_id, event_name, event_description, event_timestamp FROM payments WHERE client_id = 10 
UNION 
SELECT receiver_id as event_id, event_name, event_description, event_timestamp FROM reports WHERE receiver_id = 10 

しかし、列は名前が異なるが、同じデータ(およびデータ型)が含まれている場合は、。あなたはUNIONは、データセット内の重複行を削除することを覚えておいてくださいUNION

SELECT receiver_id as event_id, col1 as event_name, col2 as event_description, col3 event_timestamp FROM messages WHERE receiver_id = 10 
UNION 
SELECT client_id as event_id, col_a as event_name, col_b as event_description, col_c event_timestamp FROM payments WHERE client_id = 10 
UNION 
SELECT receiver_id as event_id, col_x as event_name, col_y as event_description, col_z event_timestamp FROM reports WHERE receiver_id = 10 

を達成するために、クエリ内の列の名前を変更するASを使用することができます。これがあなたが望む動作ではない場合は、代わりにUNION ALLを使用してください(重複を排除しません)。

また、列データ型がテーブル全体で同じでない場合は、共通データ型にキャストする必要があります。キャストはDBMSに大きく依存しますので、正しい方法を使用してください。

+0

ありがとうございました。これは完璧に機能しました – Mark

+0

代わりに「UNION ALL」を使用してみませんか? – jarlh

+0

@jarlh要件に応じて(質問には提供されていない)「UNION ALL」も機能します。結果セットに重複を含めるかどうかによって異なります。私の経験上、これらのタイプのインスタンスでは重複はほとんどありません。要件で別途指定されていない限り、常にUNIONに設定されています。 – jordanwillis

0

そのはかなりまっすぐ進むreceiver_idを提供し、同じ値を保持するCLIENT_ID:私はあなたが1つのクエリ内のすべてのデータを取得したい、または行うのですか、本当にあなたが望むものを理解しない

SELECT * FROM `messages` LEFT JOIN `payments` ON 
`messages`.`receiver_id` = `payments`.`client_id` LEFT JOIN `reports` 
ON `messages`.`receiver_id` = `reports`.`receiver_id` 
+0

テーブルの順序はどうですか? – jarlh

+0

オペレーションが彼の質問を修正する前に、それは文字通り 'SELECT'の一番上のセクションを示しました。今ではそれらがすべて同じ 'id'を格納していると仮定すると、これはうまく動作します – Option

+0

私は完全な外部結合を代わりに言うでしょう。 (IDに支払いがあってもメッセージがない場合...) – jarlh

0

をそれらとの結合が必要ですか?

使用すると、1つのテーブル内のすべてのデータが必要な場合は、ちょうど私が思うに、これを行うことができます:あなたが間には関係がない場合は、私たちに関係

+0

構文エラー... – jarlh

0

UnionまたはUnion Allを使用すると、3つのクエリの結果セットを連結できます。ただし、すべての3つの表には同じ量の列が必要です。より正確なソリューションのためにテーブル構造を投稿してください。

SELECT * FROM messages WHERE receiver_id = 10 
Union All 
SELECT * FROM payments WHERE client_id = 10 
Union All 
SELECT * FROM reports WHERE receiver_id = 10 
+0

同じ数の列と一致するデータ型! – jarlh

関連する問題