Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在每次对话中获取最新信息_Php_Mysql_Sql_Android Studio - Fatal编程技术网

Php 在每次对话中获取最新信息

Php 在每次对话中获取最新信息,php,mysql,sql,android-studio,Php,Mysql,Sql,Android Studio,我有一个消息表: CREATE TABLE OneToOneMessages ( MessageID int NOT NULL AUTO_INCREMENT, AuthorID int NOT NULL, RecipientID int NOT NULL, MessageText TEXT, SentTime DATETIME, PRIMARY KEY (MessageID), FOREIGN KEY (AuthorID) REFERENC

我有一个消息表:

CREATE TABLE OneToOneMessages (
    MessageID int NOT NULL AUTO_INCREMENT,
    AuthorID int NOT NULL,
    RecipientID int NOT NULL,
    MessageText TEXT,
    SentTime DATETIME,
    PRIMARY KEY (MessageID),
    FOREIGN KEY (AuthorID) REFERENCES Users(ID),
    FOREIGN KEY (RecipientID) REFERENCES Users(ID)
);
我需要从每次谈话中获得最新消息。我在网上找到了一些查询,但我不知道它们是如何工作的,也不确定它们是否完成了工作


我想我可以一个接一个地去,从每次对话中获取最后一条信息,然后按发送时间对它们进行排序。如果我可以使用一个查询来获取所有信息,那将是最好的。

您可以使用带有相关子查询的
NOT EXISTS
条件来筛选表。该条件确保不存在具有相同发件人/收件人或收件人/发件人元组且发送时间更长的其他记录:

SELECT t.*
FROM OneToOneMessages t
WHERE NOT EXISTS (
    SELECT 1
    FROM OneToOneMessages t1
    WHERE 
        (
            t.AuthorID = t1.AuthorID AND t.RecipientID = t1.RecipientID)
            OR t.RecipientID = t1.AuthorID AND t.AuthorID = t1.RecipientID
        )
        AND t1.SentTime > t.SentTime
)

如果您使用的是MySQL 8.0,则可以使用窗口函数
ROW_NUMBER()
更高效地完成此操作:


内部查询通过在具有相同发件人/收件人或收件人/发件人元组的记录组中递减发送时间对记录进行排序。外部查询仅对每个组中的顶部记录进行筛选。

您可以将
不存在
条件与相关子查询一起使用以筛选表。该条件确保不存在具有相同发件人/收件人或收件人/发件人元组且发送时间更长的其他记录:

SELECT t.*
FROM OneToOneMessages t
WHERE NOT EXISTS (
    SELECT 1
    FROM OneToOneMessages t1
    WHERE 
        (
            t.AuthorID = t1.AuthorID AND t.RecipientID = t1.RecipientID)
            OR t.RecipientID = t1.AuthorID AND t.AuthorID = t1.RecipientID
        )
        AND t1.SentTime > t.SentTime
)

如果您使用的是MySQL 8.0,则可以使用窗口函数
ROW_NUMBER()
更高效地完成此操作:


内部查询通过在具有相同发件人/收件人或收件人/发件人元组的记录组中递减发送时间对记录进行排序。外部查询仅筛选每个组中的顶部记录。

如何定义对话?如果用户a至少有一条消息发送给用户b,或者用户b至少有一条消息发送给用户b,则该消息为对话请参阅链接的重复问题。使用
GROUP BY LEASTH(AuthorID,RecipientID)、MAGEST(AuthorID,RecipientID)
对对话进行分组,而不考虑消息发送的方向。如何定义对话?如果用户a与用户b之间至少有一条消息,或者用户b与用户a之间至少有一条消息,则这是对话请参阅链接的重复问题。使用
GROUP BY LEAST(AuthorID,RecipientID)、maxist(AuthorID,RecipientID)
按对话分组,而不考虑消息发送的方向。
1
用于简化数据库工作。这样,引擎就不必查看表上的任何字段。Exists only检查某个内容是否存在,并且
1
不是空的。我只想从特定用户那里获取对话,我只是在not Exists之前添加了这个:`(t.AuthorID=$userID或t.RecipientID=$userID)`我还想按时间获取它们,所以我用了SentTime DESC的订单。非常感谢你们的帮助<代码>1用于简化数据库工作。这样,引擎就不必查看表上的任何字段。Exists only检查某个内容是否存在,并且
1
不是空的。我只想从特定用户那里获取对话,我只是在not Exists之前添加了这个:`(t.AuthorID=$userID或t.RecipientID=$userID)`我还想按时间获取它们,所以我用了SentTime DESC的订单。非常感谢你们的帮助!