2012-08-12 52 views
0

我正在嘗試創建一個消息列表,如Facebook。在SQL中創建消息列表

  1. 只顯示最後從用戶的會話消息(歷史)
  2. 當我將展示我的,當我得到的回答能夠體現回答消息(1行)

數據庫中的數據

enter image description here

SQL查詢

SELECT m.message_id, u.username, m.subject, m.message 
    , m.status, UNIX_TIMESTAMP(m.date) as date 
    FROM users u 
    LEFT JOIN messages m ON m.sender_id = u.id 
WHERE m.message_id in (SELECT max(msg.message_id) 
          FROM messages msg 
         WHERE msg.receiver_id = 3 
         GROUP BY sender_id) 
UNION 
SELECT m.message_id, u.username, m.subject, m.message 
    , m.status, UNIX_TIMESTAMP(m.date) as date 
    FROM users u 
    LEFT JOIN messages m ON m.receiver_id = u.id 
WHERE m.message_id in (SELECT max(msg.message_id) 
          FROM messages msg 
         WHERE msg.sender_id = 3 
         GROUP BY receiver_id) 
GROUP BY u.username 
ORDER BY date DESC 

我試着接受我發送的所有郵件(我的ID = 3)和所有那些通過用戶名

SQL結果發送給我和一羣:

Array 
(
    [0] => Array 
     (
      [message_id] => 10 
      [username] => 8888 
      [subject] => без темы 
      [message] => 555 
      [status] => 0 
      [date] => 11 August 2012, 2:22 
      [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg 
     ) 

    [1] => Array 
     (
      [message_id] => 7 
      [username] => 8888 
      [subject] => hi 
      [message] => 333 
      [status] => 0 
      [date] => 11 August 2012, 2:15 
      [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg 
     ) 

    [2] => Array 
     (
      [message_id] => 4 
      [username] => 6666 
      [subject] => Тема 
      [message] => 2 
      [status] => 0 
      [date] => 11 August 2012, 2:02 
      [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg 
     ) 

    [3] => Array 
     (
      [message_id] => 1 
      [username] => fffffffff 
      [subject] => privet 
      [message] => tttt 
      [status] => 0 
      [date] => 11 August 2012, 1:38 
      [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg 
     ) 

) 

由於你可以看到GROUP BY用戶名不起作用。它顯示3-> 7和7-> 3,但7-> 3是答案和最後一條消息。我不知道爲什麼團隊不工作。也許你可以用更簡單的方法來幫助我解決這個問題?

所以,SQL必須有 「SENDER_ID = 3」, 「receiver_id = 3」,並從我的表中的數據結果必須是

  • MESSAGE_ID - > 1
  • MESSAGE_ID - > 4
  • MESSAGE_ID - > 10
+1

如果你有一個SQL的問題,你可以準備一個可修改的測試用例在真棒http://sqlfiddle.com/ :) – biziclop 2012-08-12 10:25:25

回答

1

我認爲你的查詢產生了「正確」的結果,就好像你希望在某些對話中看到最後一條消息,你應該真的按conversation_id分組。儘管我沒有在圖表中看到這個字段。

如果你這樣做WHERE sender_id = 3 GROUP BY receiver_id,那麼它是正確的,該查詢返回你COS這些消息的消息1和7,」在你的設計已送往不同的人,因此,他們是不同的對話。

如果您只想查看您一般發送的最後一封郵件,只需在UNION的第二部分刪除GROUP BY即可。否則,請考慮重新設計您的模式。


編輯:

嘗試此查詢:

SELECT m.message_id, u.username, m.subject, m.message, 
     m.status, UNIX_TIMESTAMP(m.date) as `date` 
    FROM users u 
    LEFT JOIN messages m ON m.sender_id = u.id 
WHERE m.message_id IN (
    SELECT max(message_id) 
     FROM messages 
    WHERE receiver_id = 3 OR sender_id = 3 
    GROUP BY least(sender_id,receiver_id), 
       greatest(sender_id,receiver_id) 
    ); 

一些注意事項:

  1. UNION不需要了;
  2. 這種方法將把兩方之間的所有電子郵件視爲單個對話,但並非總是如此。你可能想重新設計這種方法;
  3. 對列的名稱或別名使用保留字(如date)是一種不良風格,請儘量避免這種情況。或者如果您使用反引號,請使用反引號。
+0

我想要一個用戶一個對話所以這裏仍然會是一個問題,如果用戶的ID (1)寫到(3)conversation_id將是3 ...並且如果3-> 1則id = 1顯示列表我得到相同的3-> 1而1-> 3而不是最後的消息 – Viktors 2012-08-12 12:04:00

+0

@ViktorsGolubevs,answer更新。來自食人魔的問候:) – vyegorov 2012-08-12 19:27:31