2011-09-10 32 views
0

我有以下兩個表中進行選擇:MySQL的連接表使用和不使用GROUP BY

CREATE TABLE messages (
    messageId INT, 
    threadId INT, 
    recipientUserId INT, 
    message TEXT 
); 

CREATE TABLE thread_recipients (
    recipientUserId INT, 
    threadId INT 
); 

我想SELECT特定用戶最近從消息表中的每個線程的消息。我還希望從thread_recipients表中獲取屬於所選線程一部分的所有其他用戶。

我想下面將工作:

SELECT MAX(m.messageId) AS maxMessageId, m.threadId, m.message 
    FROM messages AS m 
    RIGHT JOIN thread_recipients AS tr ON tr.threadId=m.threadId 
    WHERE m.recipientUserId='2' 
    GROUP BY m.threadId 

然而,由於GROUP BY只選擇,每一列都的threadId,不管是線的一部分的用戶數。是否可以在一個查詢中執行?

親切問候任何反應。

+0

反引號是內嵌代碼。對於[代碼塊(http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks),縮進帶有四個額外的空格的行。編輯器工具欄中的「{}」按鈕可以爲您做到這一點。單擊編輯器工具欄中的橙色問號以獲取更多信息和格式化提示。表結構應該用SQL語句顯示。由於您只是詢問SQL,因此無需將其作爲某些PHP代碼的一部分發布。 – outis

+2

是什麼在'messages'和''thread_recipients'之間recipientUserId'的區別?他們如何使用? – outis

+0

我不明白,也不能猜測,你的模式在這裏 – Bohemian

回答

0

甲骨文解決了這個簡單的使用分析功能:

select max(messageId) over (partition by threadId) ... 

通過條款,要求聚合函數沒有一組非常方便,完全符合你的情況。

在MYSQL但是,使用內選擇模仿這一點,但要記住,他們可以在內存沉重非常大的表。

SELECT mm.maxMessageId, m.threadId, m.message 
FROM messages AS m RIGHT JOIN thread_recipients AS tr ON tr.threadId=m.threadId, 
(
    select threadId, max(messageId) as maxMessageId 
    from messages group by threadId 
) AS mm 
WHERE m.recipientUserId=2 
    AND m.threadId = mm.threadId 
+0

'recipientUserId'是一個INT,所以不需要將值'2'放入單引號中(隱式類型轉換*可能會阻止索引) –

+0

你是對的,我只是盲目地試圖保持他的聲明不變,以強調改變:) – edvaldig

+0

謝謝@edvaldig ...我會給你的答案一個嘗試...所以你會如何實現這個在桌子上數百萬條消息的?......我真的努力實現與Facebook的像一個功能的信息系統......親切的問候Ĵ – jon