2016-07-22 63 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