2016-07-22 107 views
0

嗨我想在PHP中創建一個直接的消息收件箱。我試圖做出一個查詢,以獲取登錄用戶和登錄用戶已發送消息或發送消息發送給登錄用戶的所有人之間的最新消息。類似於Insatagram和Twitter在他們的收件箱中顯示登錄用戶和有消息或他們已收到消息的人之間所有對話的列表。MySql查詢直接消息

截至目前我的查詢顯示所有已登錄用戶和人有過,當我只想要登錄的用戶和任何其他用戶之間的最新消息會話之間的對話。我希望我已經解釋得很好。

我的查詢語句截至目前是:

SELECT * 
FROM dm 
WHERE(receiver="user") or (sender="user") 
ORDER BY senttime DESC; 

我直接留言表看起來像這樣:

CREATE TABLE IF NOT EXISTS dm ( 
    id INT(11) NOT NULL AUTO_INCREMENT, 
    receiver VARCHAR(100) NOT NULL, 
    sender VARCHAR(100) NOT NULL, 
    senttime DATETIME NOT NULL, 
    message TEXT NOT NULL, 
    PRIMARY KEY (id) 
) 

例如:

id receiver sender  senttime   message 
1  Jack Will  2016-07-20 20:59:27  Hi 
2  Jack Bob  2016-07-21 20:59:27  What's up 
3  Bob Jack  2016-07-22 20:59:27  Hanging out what about 

應該返回如果傑克以下是查詢中的用戶

id receiver sender  senttime   message 
3  Bob Jack  2016-07-22 20:59:27  Hanging out what about you? 
1  Jack Will  2016-07-20 20:59:27  Hi 

回答

3

嘗試是這樣的(見sqlfiddle):

SELECT * FROM dm 
INNER JOIN 
(
    SELECT MAX(id) as id FROM ( 
    SELECT MAX(id) as id, receiver as contact 
    FROM dm 
    WHERE sender="Jack" 
    GROUP BY receiver 
    UNION ALL 
    SELECT MAX(id) as id, sender as contact 
    FROM dm 
    WHERE receiver="Jack" 
    GROUP BY sender 
) t GROUP BY contact 
) d 
ON dm.id = d.id 
ORDER BY senttime DESC; 

輸出將是:

id receiver sender senttime    message 
3 Bob   Jack July, 22 2016 20:59:27 Hanging out what about 
1 Jack  Will July, 20 2016 20:59:27 Hi 

運行該代碼來創建測試數據:

CREATE TABLE IF NOT EXISTS dm ( 
    id INT(11) NOT NULL AUTO_INCREMENT, 
    receiver VARCHAR(100) NOT NULL, 
    sender VARCHAR(100) NOT NULL, 
    senttime DATETIME NOT NULL, 
    message TEXT NOT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO dm (receiver, sender, senttime, message) VALUES 
('Jack', 'Will', '2016-07-20 20:59:27', 'Hi'), 
('Jack', 'Bob', '2016-07-21 20:59:27', 'What\'s up'), 
('Bob', 'Jack', '2016-07-22 20:59:27', 'Hanging out what about'); 
+0

這不工作。查詢不區分發送者和接收者值與傑克和鮑勃。 – JoOlay

+0

嘗試新版本的代碼 –

+0

非常感謝你的男人!有用! – JoOlay