2012-03-08 72 views
0

需要一些帮助来解决这个问题。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. 什么不要有

    删除聊天会话公共= 1

它所需要做的:

  1. 选择非有效聊天的不public 1

  2. 当上次选择来自cID的消息时如果插入删除旧邮件

  3. 删除聊天记录什么不要有公开争吵与CID被删除(公共行不会得到去除,这些消息应该总是停留)

  4. 消息插入到历史

  5. = 1

问题是有在chatsession多个行具有相同的CID(一个用于每个用户,并用pulbic = 1永久) 我不懂得如果没有与该ID具有公共= 1

编辑chatsession不删除邮件:它应该如何工作

+0

通过增加一个计数与非有效聊天ID总聊天,如果非有效聊天等于总聊天消息去历史解决了这个问题。 – MakuraYami 2012-03-08 14:27:11

回答

1

只是想了解你的设置步骤2,您从chatsessions检索CID,这可能是公开或私人的(公众= 1或0)。

chatsession(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"); 
} 

好后,我可以测试这一点,但应该指向你在正确的方向?

马克

+0

消息只与它们不具有私人或公共的cID相关联,如果它的私人房间消息必须去历史记录,我alredy注意到我自己逻辑中的缺陷,更新后。 – MakuraYami 2012-03-08 14:12:59

+0

看起来更清洁!但在移动消息之前,我需要它来检查选择的cID是否是该cID的最后一行,如果还有其他需要删除该行的消息 – MakuraYami 2012-03-08 14:31:26

+0

好吧,我确实摆脱了一些查询的感谢,感谢您的时间和浪费,顺便删除多个表,您还需要定义要删除的内容:DELETE messages。*,chatsessions。* FROM。干杯 – MakuraYami 2012-03-08 15:21:11