2017-05-24 17 views
0

私はサイトをコーディングしています。ユーザーの行動を示すタイムラインを作りたいと思います。コメントは投稿されました(サイト内の記事)、投稿したメッセージフォーラム)と彼が投げた[up | down]投票。異なる列のテーブルを1つのクエリに結合する

今、私は3つのテーブル(非関連のフィールドはスキップ)持っている:私はauthor_id与えられたコメントからarticle_idフィールドを組み合わせた結果を返す、というクエリを実行したいと思います

COMMENTS 
id | author_id | article_id | timestamp 

MESSAGES 
id | author_id | thread_id | timestamp 

VOTES 
id | author_id | comment_id | message_id | type | timestamp 

を、 comment_id,message_idおよびtypeのVOTESフィールドおよび共通timestampフィールドからのthread_idフィールドのすべてがタイムスタンプでソートされています。私は、PostgreSQLを使用していて、これまでのところ、私は結果のこの種を生成することができませんでしてきた

article_id | thread_id | comment_id | message_id | type | timestamp 

:結果は次のようなものでなければなりません。

誰かが正しい方向に向いていますか?

EDIT

私は、データベース内の次のデータがあった場合、私が達成したいものを明確にする:

article_id | thread_id | comment_id | message_id | type | timestamp 
     1 |   |   |   |  | 11:00:10 
     2 |   |   |   |  | 11:00:20 
      |  20 |   |   |  | 12:00:10 
      |  21 |   |   |  | 12:00:20 
      |   |   1 |   | 1 | 13:00:10 
      |   |   |   3 | 2 | 13:00:20 

COMMENTS 
id | author_id | article_id | timestamp 
1 |   1 |   1 | 11:00:10 
2 |   1 |   2 | 11:00:20 

MESSAGES 
id | author_id | thread_id | timestamp 
3 |   1 |  20 | 12:00:10 
4 |   1 |  21 | 12:00:20 

VOTES 
id | author_id | comment_id | message_id | type | timestamp 
5 |   1 |   1 |   | 1 | 13:00:10 
6 |   1 |   |   3 | 2 | 13:00:20 

を次に結果は、このする必要があります前もって感謝します。

+0

3つのタイムスタンプのうち、どれを選択したいか、またはすべてを選びますか? –

+0

@TimBiegeleisen:ユーザーのタイムラインを生成するためにはすべてが必要です。元の投稿を更新して、達成したいことを説明しました。 –

答えて

1

私はあなたがこの出力を必要とする理由はわかりませんが、あなたは以下のユニオンクエリを試すことができます。

SELECT 
    article_id, NULL, NULL, NULL, NULL, timestamp 
FROM COMMENTS 
WHERE author_id = 1 
UNION ALL 
SELECT 
    NULL, thread_id, NULL, NULL, NULL, timestamp 
FROM MESSAGES 
WHERE author_id = 1 
UNION ALL 
SELECT 
    NULL, NULL, comment_id, message_id, type, timestamp 
FROM VOTES 
WHERE author_id = 1 
ORDER BY timestamp 
+0

これは完全な結果セットを生成しますが、共通の 'タイムスタンプ'列は含まれません。 –

+0

@JaviLavandeira申し訳ありませんが、私はそのコラムを逃しました。 –

0

ソリューション

select c.author_id ,article_id, thread_id , comment_id, message_id, type, c.timestamp 
    FROM COMMENTS c 
    LEFT JOIN MESSAGES m 
     ON c.author_id = m.author_id and c.timestamp = m.timestamp 
    LEFT JOIN VOTES v 
     ON c.author_id = v.author_id and c.timestamp = v.timestamp 
    where [email protected]_id 

タイムスタンプが同じでない場合、この

select c.author_id ,article_id, thread_id , comment_id, message_id, type, isnull(isnull(c.timestamp,m.timestamp),v.timestamp) as timestamp 
    FROM COMMENTS c 
    full JOIN MESSAGES m 
     ON c.author_id = m.author_id 
    full JOIN VOTES v 
     ON c.author_id = v.author_id 
    where [email protected]_id 
を試してみてください
+0

こんにちは。私はタイムスタンプが決して同じではないので、これはうまくいくとは思わない。 –

+0

は、左結合の代わりに完全結合を使用し、結合時のタイムスタンプのチェックを削除し、select文のc.timestampの代わりにisnull(isnull(c.timestamp、m.timestamp)、v.timestamp)を使用します。助けてください – Ravi

+0

これは、それが間違っている以外に既に提供されている回答とはどのように異なっていますか? – Hexxx

関連する問題