2012-03-08 106 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