2016-07-29 19 views
1

私は3つのクエリを実行していますが、これはほぼ同じです。後者のクエリはANDという条件を持っています。mysqlクエリに条件を追加して再度フェッチする

メインクエリ:

$mess2 = $mysqli->prepare("SELECT * from (SELECT cm.id ,cm.userid,cm.message,cm.voteup,cm.votedown,cm.date 
         FROM chat_messages cm 
         INNER JOIN members m ON m.id =cm.userid 
         INNER JOIN chat_settings cs ON cs.id = cm.room_id 
         WHERE cm.setting_id = ? AND voteup - votedown >= 5  
         ORDER BY cm.date DESC LIMIT 30) ddd 
          ORDER BY date ASC "); 
$mess2->bind_param("i", $room);        
$mess2->execute(); 
$mess2->store_result(); 

$mess2->bind_result($chatid,$chat_userid,$message,$voteup,$votedown,$date); 
while($row2 = $mess2->fetch()){ 
    //im fetching here in my <div class='div2' > 
} 

最後に、第三divに、私は少し異なるAND条件があります:

私は AND条件を追加する必要が二 divで次に

$mess = $mysqli->prepare("SELECT * from (SELECT cm.id ,cm.userid,cm.message,cm.voteup,cm.votedown,cm.date 
         FROM chat_messages cm 
         INNER JOIN members m ON m.id =cm.userid 
         INNER JOIN chat_settings cs ON cs.id = cm.room_id 
         WHERE cm.setting_id = ?   
         ORDER BY cm.date DESC LIMIT 30) ddd 
         ORDER BY date ASC "); 
$mess->bind_param("i", $room);        
$mess->execute(); 
$mess->store_result(); 

$mess->bind_result($chatid,$chat_userid,$message,$voteup,$votedown,$date); 
while($row = $mess->fetch()){ 
    //im fetching here in my <div class='div1' > 
} 

$mess3 = $mysqli->prepare("SELECT * from (SELECT cm.id ,cm.userid,cm.message,cm.voteup,cm.votedown,cm.date 
         FROM chat_messages cm 
         INNER JOIN members m ON m.id =cm.userid 
         INNER JOIN chat_settings cs ON cs.id = cm.room_id 
         WHERE cm.setting_id = ? AND votedown - voteup >= 5  
         ORDER BY cm.date DESC LIMIT 30) ddd 
          ORDER BY date ASC "); 
$mess3->bind_param("i", $room);        
$mess3->execute(); 
$mess3->store_result(); 

$mess3->bind_result($chatid,$chat_userid,$message,$voteup,$votedown,$date); 
while($row3 = $mess3->fetch()){ 
    //im fetching here in my <div class='div3' > 
} 

E非常にうまく動作しますしかし、これと同じことをやっているはややこしいようです。 1つのクエリで同じものを構築することは可能ですか?私は$mess->data_seek(0);を使用しましたが、クエリに自分の条件を追加しなかったため役に立たなかった。

+1

あなたは大きなセットを収集し、あなたが持っている列を使用してそれを減らすことはどうですか? –

+0

PhPを使用して適切なdivにどの行を挿入するかをフィルタリングして、単一のクエリ(3番目のクエリ)でフィルタすることができます。 –

+0

@JulienLachalこれは1つのdivで取得した場合に発生しますが、3つの異なるdivになります。また、他の問題は、最初のクエリで私は30を持っているので、もし私が2番目のdivに来るはずの最初の多くのデータを実行しないでください。私はこの条件を入れて、それらを持ち、30に制限する場合に限ります。 –

答えて

1

データベースを3回クエリする代わりに、データをフィルタリングするためにPhPを使用してください。私はちょうどあなたのコードをクリーンアップに基づき具体的な答えを与える

$mess3 = $mysqli->prepare(" SELECT * 
            FROM  (SELECT cm.id , 
                 cm.userid, 
                 cm.message, 
                 cm.voteup, 
                 cm.votedown, 
                 cm.date 
               FROM  chat_messages cm 
               INNER JOIN members m ON m.id =cm.userid 
               INNER JOIN chat_settings cs ON cs.id = cm.room_id 
               WHERE  cm.setting_id = ?  
               AND   votedown - voteup >= 5  
               ORDER BY cm.date DESC LIMIT 30) ddd 
            ORDER BY date ASC "); 
$mess3->bind_param("i", $room);        
$mess3->execute(); 
$mess3->store_result(); 
$mess3->bind_result($chatid,$chat_userid ,$message,$voteup,$votedown ,$date); 

while($row = $mess3->fetch()){ 
    $voteup  = $row['voteup']; 
    $votedown = $row['votedown']; 

    addToDiv1($row); 

    if($voteup - $votedown >= 5) { 
    addToDiv2($row); 
    } 

    if($votedown - $voteup >= 5) { 
    addToDiv3($row); 
    } 
} 
+0

全く間違っています。私はdiv1の通常のデータを条件なしでフェッチできません。なぜなら、3番目のクエリには絶対に反対の 'voteup-votedown> = 5'があるため、div 2にデータを取得できません。 –

+0

実際に、3つのコードブロックを比較しようとすると、どちらが冗長であるかを検出します。そうでないと、上記のコードが単純化されます。私は '$ mess2'クエリと' $ mess3'の間の変更を見ません。それは同じ質問を2回呼び出すか、間違っていますか? –

+0

私は同じことを考えましたが、それが投票の上で変化していることに気付きました。 – Rasclatt

1

:この場合、あなたは同じパラメータを使用して3回クエリを呼び出すために、このソリューションのために行くことを把握することができます。技術的には、このシナリオでは3つのコールを作成しますが、1つの関数だけを含めるため、より洗練されたものになります。

私が言及したように、私はSQLの愛好家ではないので、そこに良い解決策を与えることはできません。GROUP BYとおそらくOR節を使用できます。

/core/functions/getChatMessages.php使用するには

function getChatMessages($settings,$mysqli) 
    { 
     $id = (!empty($settings['id']))? $settings['id'] : false; 
     $type = (!empty($settings['type']))? $settings['type'] : false; 
     $max = (!empty($settings['max']))? $settings['max'] : 30; 
     $mod = ''; 
     // No id, just stop 
     if(!is_numeric($id)) 
      return false; 
     // equation one 
     if($type == 'up') 
      $mod = ' AND voteup - votedown >= 5'; 
     // equation two 
     elseif($type == 'down') 
      $mod = ' AND votedown - voteup >= 5'; 

     $mess = $mysqli->prepare("SELECT * from (SELECT cm.id ,cm.userid,cm.message,cm.voteup,cm.votedown,cm.date 
          FROM chat_messages cm 
          INNER JOIN members m ON m.id =cm.userid 
          INNER JOIN chat_settings cs ON cs.id = cm.room_id 
          WHERE cm.setting_id = ? {$mod}  
          ORDER BY cm.date DESC LIMIT {$max}) ddd 
          ORDER BY date ASC"); 
     $mess->bind_param("i", $id); 
     $mess->execute(); 
     $mess->store_result(); 
     $mess->bind_result($chatid, $chat_userid, $message, $voteup, $votedown, $date); 
     while($mess->fetch()){ 
      $result[] = array(
          'chatid'=>$chatid, 
          'chat_userid'=>$chat_userid, 
          'message'=>$message, 
          'voteup'=>$voteup, 
          'votedown'=>$votedown 
         ); 
     } 
     // Send back the data 
     return (!empty($result))? $result : array(); 
    } 

// Include our handy function 
require_once('/core/functions/getChatMessages.php'); 
// Store our id for use 
$settings['id'] = 100; 
// Should get 30 from first select 
$voteGen = getChatMessages($settings,$mysqli); 
// Should get 30 from second select 
$settings['type'] = 'up'; 
$voteUp = getChatMessages($settings,$mysqli); 
// Should get 15 from third select 
// Just for the heck of it, I added in a limit settings 
$settings['max'] = 15; 
$settings['type'] = 'down'; 
$voteDown = getChatMessages($settings,$mysqli); 
私はこれを行うとしたら、私はすべてのオプションを返すことができる機能を行うだろう

これを保存したら、foreachループを使用してビューに配置してください。これの良い点は、関数がデータを返すだけなので、いつでもどこでも呼び出し可能であることです。これにより、ビューまたは非ビューの状況でデータを扱うことができます。 サイドノート、PDOを使用していますので、mysqliがフェッチしている方法に何か効果がない場合、その理由があります。それはおそらく戻ってassoc配列をフェッチするために最適です...

関連する問題