【问题标题】:PHP / MYSQL sql selectionPHP/MYSQL sql选择
【发布时间】:2012-03-08 13:07:00
【问题描述】:

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

我的功能:

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. 删除不公开的聊天会话 = 1

需要做什么:

  1. 选择不公开的非活动聊天 1

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

  3. 将消息插入历史记录

  4. 如果插入删除旧消息

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

问题是聊天会话中有多个具有相同 cID 的行(每个用户一个,而永久的 pulbic=1 ) 如果有一个具有公共 = 1 的 ID 的聊天会话,我不知道如何不删除消息

编辑:它应该如何工作的第 2 步

【问题讨论】:

  • 通过向具有非活动聊天 ID 的聊天总数添加计数来解决此问题,如果非活动聊天等于总聊天,则消息将进入历史记录。

标签: php mysql sql


【解决方案1】:

只是想了解您的设置,您从聊天会话中检索 cID,它可以是公共的或私有的(public = 1 或 0)。

聊天会话 (cID) 中的消息都是公开的还是私有的,因为它们会继承聊天会话的属性。

或者是否能够从私人房间广播公共消息(如果是这种情况 - 您可以运行子查询/第二条语句)

编辑:

你可以减少整个过程,只使用 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");
}

我可以稍后更好地测试,但应该指出正确的方向吗?

标记

【讨论】:

  • 消息只链接到他们没有私人或公共的 cID,如果它是私人房间,消息必须进入历史,我已经注意到我自己的逻辑有缺陷,更新了帖子。跨度>
  • 看起来干净多了!但是在移动消息之前,我需要它来检查所选的 cID 是否是该 cID 的最后一行,如果还有其他的,它只需要删除该行
  • 好吧,我确实摆脱了一些查询的感谢,感谢您的时间和时间,顺便删除多个表,您需要定义要删除的内容:删除消息。*,聊天会话。* FROM .干杯
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 2014-07-18
  • 2011-02-27
  • 2015-06-21
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多