2015-10-18 75 views
0

我製作了一個使用PHP和mysql的小型郵件系統。我在消息表中將用戶鏈接爲senderreceiver。我可以列出2個用戶之間的對話。但我無法找到顯示每個對話1個消息結果的方式!消息系統,顯示對話列表

說我有用戶1,2和3。所以我的信息表可以是這樣的:

=================================================================== 
    ID || sender || receiver || text || date 
=================================================================== 
    1  ||  1  ||  2  || Hello! || timestamp stuff 
    2  ||  2  ||  1  ||  Hi! || 
    3  ||  1  ||  3  || Boo! || 

所以談話被鏈接爲

SELECT * FROM messages WHERE (sender=1 OR sender=2) AND (receiver=1 OR receiver=2); 

這樣會得到我的2個用戶之間的完整對話(真正簡化)。

但是,如何從每次對話中獲得1條消息?

我已經試過這樣的事情:

(SELECT m.text,m.date,sender.username,receiver.username 
FROM messages AS m 
INNER JOIN users AS sender on m.sender=user.ID 
INNER JOIN users AS receiver ON receiver.ID=m.receiver 
WHERE m.sender=1 OR m.receiver=1 
ORDER BY messages.date DESC LIMIT 1); 

但顯然這並沒有做我想做的,因爲只有返回一行。我想我知道我需要做什麼,我只是不知道該怎麼做? 我想我需要這樣的東西:

SELECT sender.username,receiver.username,m.text,m.date FROM messages AS m 
INNER JOIN users AS sender ON sender.ID=m.sender 
INNER JOIN users AS receiver ON receiver.ID=m.receiver 
LEFT JOIN (SELECT mes.ID 
       FROM messages AS mes 
       WHERE mes.sender=1 OR mes.receiver=1 
       ORDER BY mes.date DESC LIMIT 1) AS convo 
ON convo.ID=m.ID; 

會這樣的工作?

如果你想看到我的完整的SQL:

(SELECT sender.ID AS senderID,sender.username AS senderUsername,sender.firstname AS senderFirstname,sender.lastname AS senderLastname,sender.othername AS senderOthername,sender.url_name AS senderUrl_name,senderI.path as sender_default_image, 
                 receiver.ID AS receiverID,receiver.username AS receiverUsername,receiver.firstname AS receiverFirstname,receiver.lastname AS receiverLastname,receiver.othername AS reciverOthername,receiver.url_name AS recieverUrl_name,receiverI.path as reciever_default_image, 
                 messages.message,messages.date,messages.read 
       FROM '.$wpdb->prefix.'fishy_messages AS messages 
       INNER JOIN '.$wpdb->prefix.'fishy_users AS sender ON sender.ID=messages.sender 
       LEFT JOIN '.$wpdb->prefix.'fishy_profile_default_image AS senderDP ON senderDP.userID=sender.ID 
       INNER JOIN '.$wpdb->prefix.'fishy_users AS receiver ON receiver.ID=messages.receiver 
       LEFT JOIN '.$wpdb->prefix.'fishy_profile_default_image AS receiverDP ON receiverDP.userID=receiver.ID 
       LEFT JOIN '.$wpdb->prefix.'fishy_images AS senderI ON senderI.ID=senderDP.imageID 
       LEFT JOIN '.$wpdb->prefix.'fishy_images AS receiverI ON receiverI.ID=receiverDP.imageID 
        WHERE messages.sender=%d OR messages.receiver=%d ORDER BY messages.date DESC LIMIT 1) 

是的,我正在使用WordPress的:P

回答

1

要返回一個結果給Limit 1在外部查詢,你已經在內部查詢給出。

SELECT sender.username,receiver.username,m.text,m.date FROM messages AS m 
INNER JOIN users AS sender ON sender.ID=m.sender 
INNER JOIN users AS receiver ON receiver.ID=m.receiver 
LEFT JOIN (SELECT mes.ID 
       FROM messages AS mes 
       WHERE mes.sender=1 OR mes.receiver=1 
       ORDER BY mes.date DESC LIMIT 1) AS convo 
ON convo.ID=m.ID GROUP BY convo.ID ; 
+0

我把它放在內部查詢中,因爲我想從每個對話中有一個對話,其中有一個對話。從我的例子說我應該得到2個結果,其中sender.ID = 1或receiver.ID = 1。所以外部查詢的限制只會返回一個會話不是嗎?如果我搜索user.ID = 2,我應該只能得到1個結果。謝謝回答! – sourRaspberri

+0

那就對了!我編輯了查詢..請檢查 –

+0

差不多!你也許是對的。這只是我的一個愚蠢的XD感謝您的幫助。當我知道了,我會讓你知道並接受你的答案:p – sourRaspberri

0
SELECT sender.ID AS senderID,sender.username AS senderUsername,sender.firstname AS senderFirstname,sender.lastname AS senderLastname,sender.url_name AS senderUrl_name,receiver.ID AS receiverID,receiver.username AS receiverUsername,receiver.firstname AS receiverFirstname,receiver.lastname AS recieverLastname,receiver.url_name AS recieverUrl_name,messages.message,messages.date,messages.read 
FROM wp_6_fishy_messages AS messages 
INNER JOIN wp_6_fishy_users AS sender ON sender.ID=messages.sender 
INNER JOIN wp_6_fishy_users AS receiver ON receiver.ID=messages.receiver 
WHERE messages.sender=1 OR messages.receiver=1 
GROUP BY messages.sender,messages.receiver ORDER BY messages.date DESC 

因爲我沒有一個conversation ID/key我的談話發送者和接收者之間的位置。我已經用這兩種方式將我的桌子分組了!這給了我這些用戶之間的最後2條消息:)