【问题标题】:MySql query for direct messageMySql 查询直接消息
【发布时间】:2016-07-22 15:19:32
【问题描述】:

您好,我正在尝试在 PHP 中创建直接消息收件箱。我尝试进行查询,以获取登录用户与登录用户已发送消息或已向登录用户发送消息的每个人之间的最新消息。类似于 Insatagram 和 twitter 如何在其收件箱中显示登录用户与发送消息或发送消息的人之间的所有对话列表。

到目前为止,当我只想要登录用户和任何其他用户之间的最新消息时,我的查询显示了登录用户和与之进行过对话的人之间的所有对话。我希望我已经解释得足够好。

我现在的查询语句是:

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

【问题讨论】:

    标签: php mysql sql message


    【解决方案1】:

    试试这样的(见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'); 
    

    【讨论】:

    • 这不起作用。该查询不区分 Jack 和 Bob 的发送者和接收者值。
    • 你应该接受答案,如果它确实有效。由 SO 提供。
    猜你喜欢
    • 2013-06-12
    • 2022-01-11
    • 1970-01-01
    • 2013-01-19
    • 2013-08-13
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多