需要一些帮助来解决这个问题。
我的功能:
function cleanDatabase()
{
$allowedTime = $this->time - 10;
$query = mysql_query("SELECT * FROM `chatsessions` WHERE `last_active` < ".$allowedTime." AND `public` = 0");
if( mysql_num_rows($query) > 0 ){
while($row = mysql_fetch_array($query)){
//move messages to history for evrey cID
$query2 = mysql_query(" SELECT * FROM `messages`, `chatsessions`
WHERE messages.cID = ".$row['cID']."
AND chatsessions.cID = messages.cID
AND chatsessions.public = 0");
if( mysql_num_rows($query2) > 0 ){
while($row2 = mysql_fetch_array($query2)){
$insert = mysql_query("INSERT INTO `message_history` (`cID`, `mID`, `user_id`, `sender`, `sendtime`, `message`) VALUES
(".$row2['cID'].", ".$row2['mID'].", ".$row2['user_id'].", '".$row2['sender']."', ".$row2['sendtime'].", '".$row2['message']."')");
if($insert)
$delete = mysql_query("DELETE FROM `messages` WHERE `cID` = ".$row2['cID']);
if(!$delete)
return false;
}
}
$query3 = mysql_query("DELETE FROM `chatsessions` WHERE `cID` = ".$row['cID']." AND public = 0");
}
}
}
该函数的作用
选择不公开的非事件聊天1
从所选聊天中获取消息
将消息插入历史记录
如果插入则删除旧消息
删除不公开的聊天 session = 1
需要做什么:
选择不公开的非事件聊天1
当删除具有该 cID 的最后一行时,从 cID 中选择消息(公共(public)行不会被删除,因此这些消息应始终保留)
将消息插入历史记录
如果插入则删除旧消息
删除不公开的聊天 session = 1
问题是 chatsession 中有多行具有相同的 cID(每个用户一个,永久的 pulbic=1 ) 我不知道如果存在具有 public = 1 的 ID 的聊天 session ,如何不删除消息
编辑:其工作原理的第 2 步
最佳答案
只是想了解您的设置,您可以从聊天 session 中检索 cID,该 cID 可以是公共(public)的或私有(private)的( public = 1 或 0 )。
聊天 session (cID) 中的消息都是公开的还是私有(private)的,因为它们将从聊天 session 继承属性。
或者是否能够从私有(private)房间广播公共(public)消息(如果是这种情况 - 您可以运行一个子查询/第二条语句)
编辑:
你可以减少整个过程,只使用 2 个 sql 语句(无循环) - 类似于
function cleanDatabase() {
$allowedTime = $this->time - 10;
// update history
$query = mysql_query("INSERT INTO `message_history` (`cID`, `mID`, `user_id`, `sender`, `sendtime`, `message`) SELECT messages.cID, messages.mID, messages.user_id, messages.sender, messages.sendtime, messages.message FROM `messages`, `chatsessions` WHERE `last_active` < ".$allowedTime." AND chatsessions.cID = messages.cID AND chatsessions.public = 0");
// delte old rows
$query = mysql_query("DELETE FROM `messages`, `chatsessions` WHERE `last_active` < ".$allowedTime." AND chatsessions.cID = messages.cID AND chatsessions.public = 0");
}
我稍后可以更好地测试这一点,但应该为您指明正确的方向吗?
标记
关于PHP/MYSQL sql选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618130/