2010-11-29 58 views
1

首先,對不起我的英語不好......MySQL中的高級JOIN查詢?

我的一個MySQL查詢出現問題。我有兩個表:消息和答覆。 消息表包含一個id,discussion_id,內容和日期字段。答覆表包含一個ID,message_id,內容和日期字段。

我希望對於一個特定的討論,最新的10條消息及其答覆被提取。消息需要在最後一個回覆中排序,回覆需要首先排序。

(Facebook一樣)

我是這樣做的:

SELECT * FROM messages WHERE discussion_id = 'test' ORDER BY date DESC; 

,然後使用PHP foreach循環

SELECT * FROM replies WHERE message_id = 'test' ORDER BY date ASC; 

但是,如果我會用我所11個查詢,這並不理想。我正在考慮加入或聯合,但如果我這樣做,答覆和消息是不可分開的。該列表按照answers.date排序,但回覆和他們的父母消息不再在一起。我正在使用:

SELECT * FROM messages LEFT JOIN replies ON messages.id = replies.message_id WHERE discussion_id='4cc43b40586b6' ORDER BY replies.date DESC 

是否可以爲此任務進行一次查詢?

+0

我這樣做的時候,我總是在消息表中的列與最後回覆日期(或者如果數據很簡單,只是一個表的所有郵件和回覆)。那麼很容易先排序,然後再排序。僅供參考,它可能會爲您在插入/更新期間優化這一點而不僅僅是獲取時節省一些麻煩。 – 2010-11-29 15:31:25

回答

3

'IN'關鍵字怎麼樣?您可以將其總計減少到兩個查詢,因爲您希望將回復與郵件分開。第一個查詢是好的了,但對於第二個查詢,(我沒有檢查這對數據庫還,所以語法可能稍微偏離):

SELECT * 
FROM replies 
WHERE message_id IN (
    SELECT message_id 
    FROM messages 
    WHERE discussion_id = 'test' 
) 
ORDER BY date ASC; 

編輯(每建議在評論):

你也可以修改上面的連接以提高性能;它仍然給你兩個查詢共有的,但你想要的結果兩套反正:

SELECT * 
FROM replies 
LEFT JOIN messages ON messages.id = replies.message_id 
WHERE discussion_id='4cc43b40586b6' 
ORDER BY replies.date ASC 
+1

哦,不,依賴子查詢。將您的查詢重寫爲加入 – cristian 2010-11-29 15:49:59

1

對於一個查詢,你會想,你遍歷這些結果得到的消息ID和響應ID,也對它們進行排序。否則,你需要更多的查詢。

SELECT 
     messages.id AS messageid, 
     replies.id AS replyid, 
     *WHATEVER OTHER COLUMNS* 
FROM replies, messages 
WHERE replies.message_id = messages.discussion_id 
    AND messages.discussion_id = 'test' 
ORDER BY replies.date ASC; 

我不確定這是不是你正在尋找的東西,但是這可能會讓你開始。