Kürzung des Codes, ORDER BY und SWITCH

Können Sie mir bei der Kürzung des Codes helfen? Der Punkt ist, dass ich Daten von der Datenbank in anderer Reihenfolge abrufen möchte, abhängig von gegebenem $ T . Irgendeine Idee?

public function rewriteQuery($T){

switch ($T) {

    case 0:
        $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,1,2,3,4,5,6)";  
        break;
     case 1:
        $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,2,3,4,5,6,1)";  
        break;
     case 2:
        $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,3,4,5,6,1,2)";    
        break;
     case 3:
       $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,4,5,6,1,2,3)";  
        break;
     case 4:
      $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,5,6,1,2,3,4)";  
        break;
    default:
       $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,6,1,2,3,4,5)";  
    break;

    }        

  return $query;             

} 
0

5 Antworten

Nun, wenn du besonders schrecklich sein wolltest, könntest du die ganze Sache berechnen:

public function rewriteQuery($T){
  $num_cols = 6;
 //Build a naughty little array to pick numbers from.
  $numbers = array_merge(range(1, $num_cols, 1), range(1, $num_cols, 1));
 //Pick the section from the array corresponding to our $T
  $rotated = array_slice($numbers, $T, $num_cols);
 //Shove "id" on the front
  array_unshift($rotated, 'id');
 //Build a string
  $final_list = implode(", ", $rotated);
 //Build the SQL
  $query = "SELECT id, title FROM kshome WHERE del = 0 AND active = 1 ORDER BY FIELD($final_list)";
  return $query;
}

Aber ehrlich gesagt denke ich ehrlich gesagt nicht, dass da so viel falsch ist mit dem, was du tust. Durch das Trennen der Sortierfolge von der Hauptabfrage, wie von anderen Antworten vorgeschlagen, wird verhindert, dass Sie eine Menge Zeilen ändern müssen, wenn sich Ihre Hauptabfrage ändert, was gut ist.

Die Idee ist, eine glückliche Balance zwischen Copy-and-Paste-Code zu finden, der schwer zu pflegen ist, und Code, der so clever ist, dass Sie ihn nicht verstehen werden, wenn Sie in drei Wochen darauf zurückkommen. Und ich irrte immer an der Seite des ersteren.

Damit meine ich: Nehmen Sie diese Antwort nicht ernst - es ist nur ein Beispiel dafür, wie weit Sie in Bezug auf Lesbarkeit und Wartbarkeit schief gehen können, wenn Sie ein wenig zu weit gehen: "Ich darf mich nicht einmal vage wiederholen . "

0
hinzugefügt

Wenn ich die Redundanz beim Erstellen der Abfragezeichenfolge nicht lösche, sehe ich nicht viel mehr, was verkürzt werden könnte:

public function rewriteQuery($T){

$query = "SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD";
switch ($T) {
    case 0:
        $query.="(id,1,2,3,4,5,6)";  
        break;
     case 1:
        $query.="(id,2,3,4,5,6,1)";  
        break;
     case 2:
        $query.="(id,3,4,5,6,1,2)";    
        break;
     case 3:
       $query.="(id,4,5,6,1,2,3)";  
        break;
     case 4:
      $query.="(id,5,6,1,2,3,4)";  
        break;
    default:
       $query.="(id,6,1,2,3,4,5)";  
    break;

    }        

  return $query;             
0
hinzugefügt
String-Verkettung in PHP erfolgt mit dem . -Operator, nicht + .
hinzugefügt der Autor knittl, Quelle
$ query. = "(id, 1,2,3,4,5,6)"; und nicht $ query + = "(id, 1,2,3,4,5 , 6) "; usw. usw. usw.
hinzugefügt der Autor Funk Forty Niner, Quelle
Plus das => $ query = = sollte $ query = du hast 2x ==
hinzugefügt der Autor Funk Forty Niner, Quelle
Bitte. Sicher, stell sicher, dass du es von deiner Tastatur fern hältst ;-) Ich habe das "einmal" gemacht lol Das operative Wort hier ist einmal . Prost
hinzugefügt der Autor Funk Forty Niner, Quelle
Danke, machte die Korrekturen. Ich denke, ich sollte meinen ersten Morgenkaffee fertig machen - lol.
hinzugefügt der Autor Andrew - OpenGeoCode, Quelle

Eine Möglichkeit, dies zu verkürzen, besteht darin, ein Array zu erstellen, das die Felder für die order by zurückgibt.

Etwas wie das:

$order_by_array = array(
  0 => "(id,1,2,3,4,5,6)", 
  1 => "(id,2,3,4,5,6,1)", 
  2 => "(id,3,4,5,6,1,2)", 
  3 => "(id,4,5,6,1,2,3)", 
  4 => "(id,5,6,1,2,3,4)"
);

Dann kann Ihre Funktion rewriteQuery ($ T) wie folgt neu geschrieben werden:

public function rewriteQuery($T){
  $order_by = "(id,6,1,2,3,4,5)";//Default
  if (array_key_exists($T, $order_by_array)) {
    $order_by = $order_by_array[$T];
  }

  $query = "SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD{$order_by}";
  ...
}
0
hinzugefügt
Bitte. Kommentar gelöscht. Prost ;-)
hinzugefügt der Autor Funk Forty Niner, Quelle
@ Fred-ii-, Ups, danke, dass du das eingefangen hast. Mischung von Typ kopieren/einfügen ... :)
hinzugefügt der Autor vee, Quelle

Obwohl ich die anderen Antworten für den Fall bevorzugen würde, dass Ihre Bestellung repariert wird, ist hier eine flexiblere Lösung:

function rewriteQuery($T) {
    $query = "SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,";
    $order = array("1", "2", "3", "4", "5", "6");

    if($T < count($order)) {
        for($i = $T, $end = false;;$i++) {
            if($i == count($order)) {
                $i = 0;
                $end = true;
            }

            if($end && $i == $T) {
                break;
            }

            $query .= $order[$i] . ",";
        }

        $query = substr($query, 0, -1) . ")";

        return $query;
    } else {
        return "ERROR";
    }
}

$index = 5;

echo rewriteQuery($index);

Siehe PHPfiddle .

Grundsätzlich müssen Sie erkennen, dass Ihr $ T nichts anderes ist als der Index, von dem Sie Ihre Bestellung starten möchten (bei Ihrer Bestellung als Array). Sobald Sie das erkannt haben, können Sie die Logik implementieren:
Mit $ T gehen wir als Ausgangspunkt durch das Array, bis wir das Ende erreicht haben, setzen dann $ i auf null und aktivieren eine Endbedingung, um keine Endlosschleife auszuführen. $ i wird weiter erhöht, bis $ T erreicht ist und dann die Schleife verlassen. Alles, was übrig bleibt, ist das Entfernen des nachfolgenden , . Ich ersetze es einfach mit einem ) , um die Abfrage abzuschließen.

0
hinzugefügt

Ok, ich weiß, dass der Code kurz sein sollte, aber für den Fall, dass eine große Anzahl von Switches angefordert wird, können Sie lieber eine Schleife als manuelle Arrays ausprobieren, da Ihre Bestellung ein gutes Muster hat.

public function rewriteQuery($T)
{
    $query = "SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD";
    $fieldOrder =" (id, ";

    $j = $T;
    $i=1;

    if($j > 0 && $j < 5)   //or whatever you wish
    {   
        while(1)
        {  //replace 6 (below) by whatever your limit is
            $fieldOrder .= ($j % 6) + 1;

            if($i < 6)
                $fieldOrder .= ", ";
            else
                break;

            $j++; $i++;
        }

    }
    else
    {   $fieldOrder .= "6, 1, 2, 3, 4, 5"; 
       //or maybe a loop again! :-D
    }
    $fieldOrder .= " )";
    return($query.$fieldOrder);
}
0
hinzugefügt
PHP - Deutsche Gemeinschaft
PHP - Deutsche Gemeinschaft
5 der Teilnehmer

In dieser Gruppe sprechen wir über PHP. Partner: de.switch-case.com