2016-07-29 2 views
1

У меня есть 3 запроса, которые я запускаю, которые почти идентичны, последние два имеют условие AND.Добавление условия для запроса mysql и выборки снова

Основной запрос:

$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' > 
} 

Затем, во втором div я должен добавить AND условия:

$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 условия:

$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 очень все работает BUT делать это почти такой же запрос похоже неуклюжий. Можно ли построить одно и то же с одним запросом? Я использовал $mess->data_seek(0);, но это не помогло, потому что я не добавил мое условие к запросу.

+1

Как насчет того, что вы собираете большой набор, а затем уменьшаете его с помощью PHP и столбцов, которые у вас есть? –

+0

Вы можете фильтровать, чтобы узнать, какая строка вставляется в соответствующий div, используя PhP, с вашим единственным запросом (третий). –

+0

@JulienLachal это может произойти, если я забираю в один div, но это 3 разных div. И также другая проблема, в первом запросе у меня есть ограничение 30. так что если я запустил первые много данных, которые должны были прийти во второй div, не приходите. только если я поставлю это условие И, которое принесет только те и ограничит 30. –

ответ

1

Просто перейдите к PhP, чтобы отфильтровать данные вместо тройного запроса вашей базы данных. В этом случае вы можете выяснить, чтобы пойти на это решение, потому что вы вызываете 3 раза запрос с тем же параметром:

$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 без каких-либо условий, я не могу получить данные в div 2, потому что это полностью противоположное 'voteup-votedown> = 5', которое никогда не будет в третьем запросе. –

+0

На самом деле, если вы попытаетесь сравнить свой 3 блока кода, вы обнаружите, что избыточно, а что нет, поэтому приведенный выше код упрощен. Я не вижу изменения между запросом '$ mess2' и' $ mess3'. Это нормально, вы дважды вызываете один и тот же запрос или я ошибаюсь? –

+0

Я думал то же самое, но потом заметил, что он меняется на голосовые и голосовые уравнения – Rasclatt

1

Я просто дать ответ, основанный именно на очистку кода. Технически вы все равно сделаете 3 вызова в этом сценарии, но он будет более чистым, потому что вы включаете только одну функцию, вы не видите сценарий позади него.

Как я уже говорил, я не сторонник 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, это будет поэтому. Скорее всего, лучше всего получить массив-аргумент для возврата ...

Смежные вопросы