2016-07-29 8 views
1

Ich habe 3 Abfragen, die ich ausführen, die fast identisch sind, die letzten beiden haben eine AND Bedingung.Hinzufügen Bedingung für MySQL Abfrage und holen wieder

Haupt query:

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

Dann in den zweiten div Ich habe eine AND Bedingung hinzuzufügen:

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

schließlich in den dritten div habe ich einen etwas anderen AND Zustand:

$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 Alles funktioniert ABER tun diese fast gleiche Abfrage scheint plump. Ist es möglich, dasselbe mit nur einer Abfrage zu konstruieren? Ich habe $mess->data_seek(0); verwendet, aber es hilft nicht, weil ich meine Bedingung der Abfrage nicht hinzugefügt habe.

+1

Was ist mit dir sammeln die größere Menge, und dann reduzieren Sie es mit PHP und die Spalten, die Sie haben? –

+0

Sie können filtern, um zu wissen, welche Zeile in der entsprechenden Div einfügen PhP, mit Ihrer einzigen Abfrage (die dritte). –

+0

@JulienLachal dies kann passieren, wenn ich in einem Div holen, aber sie sind 3 verschiedene Divs. UND auch anderes Problem, in der ersten Frage habe ich Grenze 30. so, wenn ich die ersten vielen Daten laufen lasse, die im zweiten Div kommen sollen, komme nicht. nur wenn ich diese AND Bedingung setze, die genau diese und die Grenze auf 30 bringt. –

Antwort

1

Gehen Sie einfach für PhP, um Ihre Daten zu filtern, anstatt Ihre Datenbank dreifach abzufragen. In diesem Fall können Sie für diese Lösung zu gehen, herauszufinden, weil Sie 3 mal Ihre Abfrage mit dem gleichen Parameter aufrufen:

$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

Nein Sir, total falsch. Ich kann normale Daten in div1 ohne Bedingung holen, ich kann Daten zu div 2 nicht bekommen, weil total ist das Gegenteil 'voiceup-votingown> = 5' es wird nie in der dritten Frage kommen. –

+0

In der Tat, wenn Sie versuchen, Ihre 3 Blöcke Code zu vergleichen, werden Sie feststellen, welche redundant ist und welche nicht, deshalb ist der obige Code vereinfacht. Ich sehe den Wechsel zwischen '$ mess2' query und' $ mess3' nicht. Ist das ok, rufst du zweimal die selbe Abfrage an oder liege ich falsch? –

+0

Ich dachte das gleiche, aber dann bemerkte, dass es auf die Abstimmung ändert und die gewählten Gleichungen – Rasclatt

1

werde ich nur eine Antwort geben Sie den Code basiert speziell auf aufzuräumen. Technisch werden Sie in diesem Szenario immer noch die 3 Aufrufe durchführen, aber es wird sauberer sein, da Sie nur eine Funktion enthalten, Sie sehen das Skript nicht dahinter.

Wie ich bereits erwähnt habe, bin ich kein SQL-Aficionado, also kann ich dort keine gute Lösung geben (vielleicht können Sie GROUP BY und vielleicht eine OR Klausel ... ich weiß es nicht wirklich ...). Wenn ich das täte, würde ich eine Funktion tun, die alle Optionen zurückkehren können:

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

benutzen:

// 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); 

Nun, da Sie diese gespeichert haben, verwenden Sie einfach eine foreach Schleife, um sie in Ihre Ansicht zu platzieren. Die gute Seite davon ist, dass Sie dies immer und überall aufrufen können, da die Funktion nur Daten zurückgibt. Es ermöglicht Ihnen, mit den Daten in einer Ansichts- oder Nichtansichtssituation zu arbeiten. Seitliche Notiz, ich benutze PDO, also, wenn es etwas ineffektives mit der Art und Weise der mysqli holt, wird das der Grund sein. Es ist wahrscheinlich am besten, ein assoziatives Array zurück zu holen ...