2012-10-11 60 views
0

對於不恰當的措辭標題,我表示歉意。想不到更好的一個。如何連接兩個大不相同的mysql表,並且一次排列兩列?

我有一個應用程序發送和接收消息。我有兩個表,一個用於發送一個用於接收:

發送:

id 
status 
sent_date 
user_id 
sent_message 
sent_from 
sent_to 
another_field1 
another_field2 
comments 

收稿日期:

id 
received_date 
user_id 
received_message 
received_from 
received_to 
another_field3 
another_field4 
comments 

我試圖顯示基於會話主題這兩張表。我需要通過user_id加入兩個,WHERE received.received_from = sent.sent_to和received.received_to = sent.sent_from AND sent.status = 1 [表示它已發送],然後在兩個日期列中對它們進行排序 - 所以消息按對話順序顯示。

我看到了其他類似的問題,使用工會來做到這一點,但我不確定這是否適用於我的情況由於列不同。我的顯示屏,在PHP中完成的,將是這樣的:

談話{} sent_to,按日期排序:

{sent_date} From me: {sent_message} 
{received_date} From {received_from}: {received_message} 
{received_date} From {received_from}: {received_message} 
{sent_date} From me: {sent_message} 

另外,我意識到,我可能已經低效結構化數據庫。我願意就如何更好地優化結構以及如何運作提出建議。謝謝。

編輯:我只是試着做阿蘭柯林斯的建議,但我很難搞清楚如何從收到的字段中分離發送的字段。我真的想把這兩張桌子放在一起,但是沒有結合實際的領域。這是我到目前爲止,這是完全錯誤的:

SELECT *, 
    case when sent.sent_date is not null then sent.sent_date 
    else received.received_date end AS date 
FROM sent JOIN received ON (received.user_id = sent.user_id) 
WHERE sent.user_id = ".$_SESSION['id']." ORDER BY date ASC 

這是加入收到和發送的消息到一行。我仍然需要他們分開。有關如何做到這一點的任何提示?在單個表中同時發送和接收消息可能會更容易一些嗎?編輯2:爲了澄清,我希望兩個表中的列分開。也就是說,返回的ROWS應該只有發送的列或接收到的列,但行應按日期順序返回,如上所述。所以,我會得到行是這樣的:

Row 1: Array(Date, Sent_Message, Sent_From) 
Row 2: Array(Date, Received_Message, Received_From) 
Row 3: Array(Date, Received_Message, Received_From) 
Row 4: Array(Date, Sent_Message, Sent_From) 

所以只有兩個共同點與兩個表1),具有通話和2)日期user_ID的。日期必須以某種方式合併,因爲它們當前是「sent_date」和「received_date」。

回答

0

(SELECT sent_date AS date, sent_message, sent_from 
FROM sent WHERE user_id = ".$_SESSION['id'].") 
UNION ALL (SELECT received_date AS date, received_message, received_from 
FROM received WHERE user_id = ".$_SESSION['id'].") 
ORDER BY date ASC 
+0

既然你提到加入,我想你是加入。好吧。很高興你能解決問題。 –

1

如果圍繞'thread_id'構造表而不是嘗試通過'sent_to = recd_from'進行匹配,您可能會更容易。當一個新消息被創建(即沒有響應)時,用一個新的消息ID創建一個新線程。然後對此的任何響應都會引用原始的thread_id,並且可以通過消息ID對響應進行排序以獲取線程的順序。

+0

可能使WHERE子句更容易一些,但我的問題的主要問題仍未解決。我很難將收到的列與發送的列分開。任何想法如何與MySQL查詢做到這一點?我用迄今爲止的代碼編輯了主帖。 –

0

創建一個包含從基礎表和排序的日期一欄:我想通了正確的查詢我想要做

select case 
    when sent.sent_date is not null then sent.sent_date 
    else received.received_date 
end as message_date 
... 
order by message_date; 
+0

我無法從查詢中分離收到的列中發送的列。它目前將它們組合成一行,這不是我想要的。我用迄今爲止的代碼編輯了主帖。你介意給我啓迪嗎? –

+0

我閱讀了您希望獲得4列的要求,其中包含發送和接收消息的組合(如上面的「轉換」標題所示)。如果這不是你想要的輸出,你能向我們展示嗎? –

+0

我對此感到抱歉。我第二次編輯了主要帖子。換句話說,我試圖將一個表添加到另一個表,然後獲取我想要的user_id,並按日期排序。我不是想把行組合在一起。對不起,用文字解釋相當困難= \感謝您的幫助! –

相關問題