2010-04-29 44 views
0

我想選擇收到的最後10條消息或發送給不同用戶的消息。要求選擇不同用戶最近發送/收到的10條消息

例如結果必須顯示這樣的:

1. John1 - last message received 04/17/10 3:12 
2. Thomy - last message sent 04/16/10 1:26 
3. Pamela - last message received 04/12/10 3:51 
4. Freddy - last message received 03/28/10 9:00 
5. Jack - last message sent 03/20/10 4:53 
6. Tom - last message received 02/01/10 7:41 
..... 

表看起來像:

CREATE TABLE `messages` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`sender` int(11) DEFAULT NULL, 
`receiver` int(11) DEFAULT NULL, 
`content` text 
) 

我認爲Facebook(和iPhone)使用該溶液。當你去你的郵箱,你有最後的消息收到/發送按用戶(朋友)分組。

所以我會舉一個例子。如果我有論文消息(它們是YET訂購):因爲他們收到通過我的用戶發送的最後一封郵件/

**Mike** 
**Tom** 
**Pam** 
Mike 
Mike 
**John** 
John 
Pam 
**Steve** 
**Bobby** 
Steve 
Steve 
Bobby 

與****唯一的消息應該返回。

其實我想每個討論的最後一條消息。

解決方案是什麼?

回答

3

這個問題有點不清楚。如果你只是想涉及用戶#12345過去的10封郵件,只需使用:

SELECT * 
FROM  messages 
WHERE sender = 12345 OR receiver = 12345 
ORDER BY time DESC 
LIMIT 10 

更新,以符合您更新的要求。不是最優雅的,但是隻要沒有用戶在同一秒內發送兩條消息就行。

SELECT m1.* 
FROM  messages m1 
     INNER JOIN (SELECT MAX(time) AS time, 
           IF(receiver = 12345, sender, receiver) AS user 
        FROM  messages 
        GROUP BY user) m2 
      ON m1.time = m2.time AND (m1.sender = m2.user OR m1.receiver = m2.user) 
WHERE sender = 12345 OR receiver = 12345 
ORDER BY m1.time DESC 
+0

您所查詢的是好的,但它不是真正的我想。我在下面解釋了你。 – 2010-04-29 07:36:58

+0

沒什麼不好。但是我下面提出的解決方案呢? – 2010-04-29 08:31:24

+0

好的最大你的查詢比我的好。它正常工作。 我剛剛使用的是ID而不是時間,因爲使用ID訂購比使用TIME更快,並且您可以同時發送消息 – 2010-04-29 08:42:36

0

也許你正在尋找GROUP BY,雖然具有SenderReceiver獨立的領域,因此這很難。

恕我直言,最好是有UserIDMessageDirection SET('IN','OUT')

然後,你可以讓

SELECT UserID, MAX(time) GROUP BY UserID 

編輯

如果你想最後10

SELECT UserID, MAX(time) GROUP BY UserID ORDER BY time LIMIT 10 

它可能不是最快的解決方案,可以進行優化。

+0

是的,實際上它不可能同時由RECEIVER和SENDER分組。我會嘗試你的解決方案。我很快就會給你一個備份。 – 2010-04-29 07:55:29

+0

事實上,我認爲不可能避免擁有2個字段的發件人或收件人,因爲在您的解決方案中,我無法知道是誰發送或接收了郵件 – 2010-04-29 08:00:05

+0

您可以按照IF(receiver = 12345,發件人,接收器)'。 – 2010-04-29 08:00:25

0

我想我已經找到了使用Max Shawabkeh提示的解決方案。但事實上,我認爲我可以優化它。

SELECT * 
FROM 

(
SELECT * 
FROM messages 
ORDER BY sendtime DESC 
) messages2 

WHERE receiver = @id_user 
OR sender = @id_user 
GROUP BY IF(receiver = @id_user, sender, receiver) 

我認爲這是一個更好的解決方案....

1

最大Shawabkeh的查詢真的幫我理解這個問題。在我正在開發的網站上實施它時,我發現它錯過了一個邊緣條件。

基本上有三種狀態是可能的每個消息線程:

  1. 您發送郵件來回。
  2. 您只向其他用戶發送消息。
  3. 您只收到來自其他用戶的消息。

(「您」是指用戶12345要爲其檢索消息線程。)

最大的查詢未接狀態#3。我發現,添加一個WHERE子句在內部聯接的查詢不僅固定的,這也限制了結果不僅關係到用戶的線程12345

SELECT m1.* 
FROM  messages m1 
     INNER JOIN (SELECT MAX(time) AS time, 
           IF(receiver = 12345, sender, receiver) AS user 
        FROM  messages 
        WHERE sender_id = 12345 OR receiver_id = 12345 
        GROUP BY user) m2 
      ON m1.time = m2.time AND (m1.sender = m2.user OR m1.receiver = m2.user) 
WHERE sender = 12345 OR receiver = 12345 
ORDER BY m1.time DESC