2012-03-08 15 views
0

これを理解する助けが必要です。PHP/MYSQL SQLの選択

My機能:

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. メッセージの最後の削除古いメッセージ

    公共持っていけないものを
  3. 削除チャットセッションを挿入した場合、そのCIDを持つ行は、(公共の行は文句を言わないので、これらのメッセージは、常に滞在する必要が削除されます)歴史

  4. 挿入メッセージを削除されます= 1

問題は、私はいけない複数の行が同じCID(すべてのユーザー用とpulbic = 1永久) とchatsessionであるです公衆= 1

編集有しているIDとchatsessionがある場合は、メッセージを削除しないでする方法を知っている:それはちょうどあなたのセットアップを理解しようと

+0

非有効のチャットIDを持つ総チャットに数を追加し、非有効のチャットが総チャットに等しい場合、メッセージは歴史に行くことによってそれを解決しました。 – MakuraYami

答えて

1

に動作する方法のステップ2は、あなたがchatsessionsからCIDを取得し、これは公開または非公開(public = 1または0)のいずれかになります。

チャットセッション(cID)内のメッセージは、チャットセッションのプロパティを継承するため、すべて公開または非公開になりますか。

またはプライベートルームから放送の公共のメッセージを持っている能力がある(このような場合には - あなたが実行することができますサブクエリ/第二文があります)

EDIT:あなたは減らすことができ

は、全体の手順のみ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にしかリンクされていません。プライベートルームやプライベートルームはメッセージが履歴に送られなければならないので、私は自分のロジックの欠陥を気付きました。 – MakuraYami

+0

それははるかにきれいに見えます!メッセージを移動する前に、選択したcIDがそのcIDの最後の行であるかどうかを確認する必要があります。他にもその行だけを削除する必要がある場合は – MakuraYami

+0

私はあなたの時間と手術のために、ところで、複数のテーブルを削除するには、削除するものを定義する必要があります。DELETE messages。*、chatsessions。* FROM。乾杯 – MakuraYami