2017-05-24 94 views
0

我正在編碼一個網站,並且希望製作一個時間線來顯示用戶的活動:他寫的評論(關於網站中的文章),他發佈的消息(關於論壇)和他上演的[上/下]投票。將具有不同列的表合併到單個查詢中

現在我有三個表(非相關領域跳過):

COMMENTS 
id | author_id | article_id | timestamp 

MESSAGES 
id | author_id | thread_id | timestamp 

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

我想執行,給予author_id將返回一個結果article_id場自評相結合的查詢時,來自MESSAGES的thread_id,來自VOTES的comment_id,message_idtype字段以及共同的timestamp字段,全部按時間戳排序。結果應該是這樣的:

article_id | thread_id | comment_id | message_id | type | timestamp 

我使用PostgreSQL,到目前爲止,我一直無法產生這種結果。

有人可以指出我正確的方向嗎?

編輯

爲了澄清我想達到的目標,如果我在數據庫中的以下數據:

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 

那麼結果應該是這樣的:

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 

提前致謝。

+0

你想選擇三種時間戳中的哪一種,或者你想要所有這三種時間戳? –

+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

這確實會生成完整的結果集,但它不包含常見的'timestamp'列。 –

+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

嗨Ravi。我不認爲這會起作用,因爲時間戳永遠不會相同。 –

+0

使用完全連接來取代左連接,並刪除連接中的時間戳檢查,並在select語句中使用isnull(isnull(c.timestamp,m.timestamp),v.timestamp)替代c.timestamp,我認爲它會幫助你 – Ravi

+0

除了錯誤之外,它與已經提供的答案有什麼不同 – Hexxx

相關問題