PHP/MYSQL sql选择

标签 php mysql sql

需要一些帮助来解决这个问题。

我的功能:

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. 选择不公开的非事件聊天1

  2. 从所选聊天中获取消息

  3. 将消息插入历史记录

  4. 如果插入则删除旧消息

  5. 删除不公开的聊天 session = 1

需要做什么:

  1. 选择不公开的非事件聊天1

  2. 当删除具有该 cID 的最后一行时,从 cID 中选择消息(公共(public)行不会被删除,因此这些消息应始终保留)

  3. 将消息插入历史记录

  4. 如果插入则删除旧消息

  5. 删除不公开的聊天 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/

相关文章:

sql - Postgresql 串行每日记录计数

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

php - 左边距在文本中不能正常工作

PHP/邮件/MySQL : Email Confirmation for Register

php - 创建表时出错 : Key column doesn't exist

php - MySql 在选择查询中返回不正确的日期值

php - 更新mysql中每一行的表列

php - Symfony2\Doctrine - 数据库中的存储数组

php - 为什么此 SQL 会出现语法错误?

多态关联连接的 MySQL 错误 id 返回