您好,我正在尝试用 PHP 创建直接消息收件箱。我尝试进行查询,以获取登录用户与登录用户已发送消息或已将消息发送给登录用户的每个人之间的最新消息。类似于 Insatagram 和推特如何在他们的收件箱中显示已登录用户与向他们发送消息或他们已经发送消息的人之间的所有对话列表。
截至目前,当我只想要登录用户与任何其他用户之间的最新消息时,我的查询显示了登录用户与与之交谈过的人之间的所有对话。我希望我已经很好地解释了这一点。
我现在的查询语句是:
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
如果 Jack 是查询中的用户,应该返回以下内容
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
最佳答案
尝试这样的事情(参见 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');
关于php - 直接消息的 MySql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38530065/