2012-10-25 39 views
4

獲取我需要登錄的用戶之間最後一條消息獲取他曾與聊,就像Facebook的所有用戶。這將像facebook.com/messages頁面一樣。 這裏是我做了什麼至今數據庫查詢到的最後一條消息從每個用戶(如Facebook消息)

數據庫

USER_TABLE
- CWID
- FIRST_NAME
- 姓氏
- user_image_link

消息
- ID
- cwid1 (發件人ID)
- cwid2(接收裝置ID)
- 消息(消息內容)
- messagetime(時間戳)
- userread(枚舉 'Y' 'N')`

查詢 登錄的用戶擁有ID = 1

SELECT  
user_table.cwid,  
    message.cwid1, 
    message.cwid2, 
    message.message, 
    message.userread, 
    MAX(message.messagetime), 
    user_table.first_name, 
    user_table.last_name, 
    user_table.user_image_link 
    FROM message 
    INNER JOIN user_table 
    ON message.cwid1 = user_table.cwid 
    WHERE (cwid2="1") 
    GROUP BY cwid1 
    ORDER BY messagetime DESC 

這將返回由所有誰給他發了消息。我需要也獲取所有已通過此用戶發送消息的人一個用戶收到最後一封郵件同樣,也可以通過

SELECT  
user_table.cwid, 
    message.cwid1,  
    message.cwid2,  
    message.message, 
    message.userread,  
    MAX(message.messagetime), 
    user_table.first_name,  
    user_table.last_name,  
    user_table.user_image_link  
    FROM message  
    INNER JOIN user_table  
    ON message.cwid1 = user_table.cwid 
    WHERE (cwid1="1")  
    GROUP BY cwid2  
    ORDER BY messagetime DESC  

就像Facebook的消息做了我需要他們具有鮮明的用戶都混合和分類由messagetime。我是一個新手到MySQL,任何幫助是極大的讚賞。謝謝!

+0

只是看了一眼,好像你想添加'WHERE(cwid1 =「1」或cwid2 =「1」)''。這是否給你你想要的結果? –

回答

2

我對它進行了一些處理,並提出了這個問題。 - 它列出最近的用戶,誰給我發郵件或從我 收到消息的消息 - 這也包括來自羣聊的消息,組可以由任何人及任何一組內創建可以邀請自己的朋友 - 它還包括讀/未讀標誌以突出顯示前端未讀消息。

這不是最有效或優雅的查詢,但它的工作原理。任何改進都非常受歡迎

SELECT * 
FROM (
SELECT * 
FROM (

SELECT * 
FROM (

SELECT users.id,'0' AS groupId, users.name, users.profilePic, messages.time,messages.message , 'Y' AS unread 
FROM users 
INNER JOIN messages ON messages.userId2 = users.id 
WHERE messages.userId1 = '" . $userId . "' 
UNION 
SELECT users.id,'0' AS groupId, users.name,users.profilePic, messages.time, messages.message , messages.read AS unread 
FROM users 
INNER JOIN messages ON messages.userId1 = users.id 
WHERE messages.userId2 = '" . $userId . "' 
) AS allUsers 
ORDER BY TIME DESC 
) AS allUsersSorted 
GROUP BY id 
UNION 
select * from(
SELECT '0' AS id, msgGroups.id AS groupId, msgGroups.name, msgGroups.image AS profilePic, IF(userGroupMsg.time IS NULL,userGroups.createdOn,userGroupMsg.time) AS time,IF(userGroupMsg.message IS NULL,'',userGroupMsg.message), 'Y' AS unread 
FROM msgGroups 
LEFT JOIN userGroups ON msgGroups.id = userGroups.groupId 
LEFT JOIN userGroupMsg ON msgGroups.id = userGroupMsg.groupId 
WHERE userGroups.userId = '" . $userId . "' 
ORDER BY time DESC 

)AS allUsersSorted 
GROUP BY groupId 

)AS allSorted 
ORDER BY TIME DESC 

請改善,如果任何人都可以。

+0

偉大的邏輯。只有那些有消息的用戶。但我想從用戶表的所有用戶。 。 –

1

也許這樣的事情:

SELECT 
    DISTINCT m.id, m.cwid1, m.cwid2, m.message, m.userread, m.messagetime, 
    u.first_name, u.last_name, u.user_image_link 
FROM 
    user_table u, 
    message m, 
    (
    SELECT DISTINCT IF(cwid1 = "1", cwid2, cwid1) AS id 
    FROM message 
    WHERE "1" IN (cwid1, cwid2) 
) partner 
WHERE 
    u.cwid = partner.id 
    AND (m.messagetime, m.cwid1, m.cwid2) IN 
    (
     SELECT MAX(messagetime), cwid1, cwid2 
     FROM message 
     WHERE (cwid1, cwid2) IN ((partner.id,"1"),("1",partner.id)) 
     GROUP BY cwid1, cwid2 
    ) 
ORDER BY m.messagetime DESC 

而且請注意FROM子句中沒有出現像MAX聚合函數的所有列必須出現GROUP BY子句。在這種情況下,MySQL不會引發錯誤,但非聚合列中的值是隨機的。

0
Try this 
select m.* ,u.* 
      from 
       messages m 
       inner join (
       select max(id) as maxid 
       from messages 
       where messages.list_id = " '. $data['list_id'] .'" 
       group By (if(sender_id > reciever_id, sender_id, reciever_id)), 
       (if(sender_id > reciever_id, reciever_id, sender_id)) 
       ) t1 on m.id=t1.maxid 
相關問題