2017-03-12 3 views
1

Ich versuche, die Reihenfolge der MySQL-Ergebnisse abhängig davon zu ändern, ob eine if Bedingung in PHP erfüllt ist.PHP MySQL-Reihenfolge ändern, wenn Bedingung erfüllt

Mein Code überprüft, ob Zeilen duplicates sind, und ändert die Zeilenklasse, falls dies der Fall ist.

Was ich versuche zu erreichen ist, wenn es ein Duplikat gibt, dann ist die MySQL-Abfrage von Frequency bestellt und wenn es keine Duplikate gibt, dann bestellen Sie es durch Name.

Das ist, was ich habe:

function getFrequencies() { 
    $conn = getConnected("websiteData"); 
    $frequencyQuery = " 
     SELECT 
     f.Name, 
     f.Frequency, 
     f.Country, 
     f.Programmed, 
     (SELECT count(*) FROM frequencies WHERE Frequency = f.Frequency) as count 
     FROM frequencies f; 
     "; 

    $frequencyResult = mysqli_query($conn, $frequencyQuery); 
    while ($frequencyRow = mysqli_fetch_assoc($frequencyResult)) { 
    if($frequencyRow['count'] > 1) { 
     $frequencyQuery = " 
     SELECT 
      f.Name, 
      f.Frequency, 
      f.Country, 
      f.Programmed, 
      (SELECT count(*) FROM frequencies WHERE Frequency = f.Frequency) as count 
     FROM frequencies f 
     ORDER BY Frequency; 
     "; 
    } else { 
     $frequencyQuery = " 
     SELECT 
      Name, 
      Frequency, 
      Country, 
      Programmed 
     FROM frequencies 
     ORDER BY Name; 
     "; 
    } 
    } 
    $frequencyResult = mysqli_query($conn, $frequencyQuery); 

    while ($frequencyRow = mysqli_fetch_assoc($frequencyResult)){ 
    if ($frequencyRow['count'] > 1) { 
     echo '<tr class="warning">' . 
      "<td>" . $frequencyRow['Name'] . "</td>" . 
      "<td>" . $frequencyRow['Frequency'] . "</td>" . 
      "<td>" . $frequencyRow['Country'] . "</td>" . 
      "<td>" . $frequencyRow['Programmed'] . "</td>" . 
      "</tr>" . PHP_EOL; 
    } else { 
     echo "<tr>" . PHP_EOL . 
      "<td>" . $frequencyRow['Name'] . "</td>" . 
      "<td>" . $frequencyRow['Frequency'] . "</td>" . 
      "<td>" . $frequencyRow['Country'] . "</td>" . 
      "<td>" . $frequencyRow['Programmed'] . "</td>" . 
      "</tr>" . PHP_EOL; 
    } 
    } 
} 

Jetzt weiß ich für eine Tatsache, dass meine Tabelle Duplikate enthält, aber derzeit gibt es keine markierten Zeilen und die Reihenfolge von Name.

Bevor ich meinen Code auf die oben geändert stellte man fest, es war dies eine, die meine doppelte Zeilen hat hervorgehoben:

function getFrequencies() { 
    $conn = getConnected("websiteData"); 
    // $frequencyQuery = "SELECT Name, Frequency, Country, Programmed, count(*) FROM frequencies GROUP BY Frequency ORDER BY Name"; 
    $frequencyQuery = " 
     SELECT 
     f.Name, 
     f.Frequency, 
     f.Country, 
     f.Programmed, 
     (SELECT count(*) FROM frequencies WHERE Frequency = f.Frequency) as count 
     FROM frequencies f 
     ORDER BY Frequency; 
     "; 
     $frequencyResult = mysqli_query($conn, $frequencyQuery); 

     while ($frequencyRow = mysqli_fetch_assoc($frequencyResult)) { 
     if ($frequencyRow['count'] > 1) { 
      echo '<tr class="danger">' . PHP_EOL . 
       "<td>" . $frequencyRow['Name'] . "</td>" . PHP_EOL . 
       "<td>" . $frequencyRow['Frequency'] . "</td>" . PHP_EOL . 
       "<td>" . $frequencyRow['Country'] . "</td>" . PHP_EOL . 
       "<td>" . $frequencyRow['Programmed'] . "</td>" . PHP_EOL . 
       "</tr>" . PHP_EOL; 
     } else { 
      echo "<tr>" . PHP_EOL . 
       "<td>" . $frequencyRow['Name'] . "</td>" . PHP_EOL . 
       "<td>" . $frequencyRow['Frequency'] . "</td>" . PHP_EOL . 
       "<td>" . $frequencyRow['Country'] . "</td>" . PHP_EOL . 
       "<td>" . $frequencyRow['Programmed'] . "</td>" . PHP_EOL . 
       "</tr>" . PHP_EOL; 
     } 
    } 
    } 

Was kann ich tun, um zu erreichen, was ich tun möchte? Der Grund, warum ich die Reihenfolge ändern möchte, ist, dass, wenn keine Duplikate vorhanden sind, die Liste alphabetisch durchgeblättert wird, aber wenn es Duplikate gibt, werden die Duplikate durch die Reihenfolge Frequency um eine Zeile nach der anderen verschoben, so dass find und edit/delete.

+0

Es ist HTML, also brauchen Sie keine Zeilenumbrüche, und Sie brauchen nicht 'PHP_EOL' zu verwenden. '" \ n "' ist normalerweise genug. – tadman

+0

erhalten Sie Resultset wie erwartet in SQL-Abfrage? –

+0

Ich habe versucht, meinen Quellcode sauber zu halten, obwohl, wenn Sie sich meinen ersten und zweiten Code anschauen, ich viele von denen entferne, um es ein bisschen aufzuräumen, weil ich merkte, dass ich viel zu viele gesetzt habe. –

Antwort

0

Basierend auf dem, was Sie versuchen, würde ich ein assoziatives Array der Ergebnisse erstellen und dann Ihre Logik verwenden, um sie mit PHP anstelle von MySQL order by Klausel bestellen.

Verfahren Sie nehmen könnte (wenn Sie alle Duplikate beibehalten möchten) würde die Tabelle zu erstellen, indem das Array von der Namekey Sortieren und dann sagen if unique displayelsefor each duplicate in array display, die in allen Duplikaten in Folge führen angezeigt wird , wenn das Ganze alphabetisch nach Name sortiert ist, können Sie hierfür asort verwenden.

Um diese Auslösung von Nebenwirkungen zu verhindern, könnten Sie zwei Arrays erstellen, eines aus dem MySQL select und eines, das mit array_unique einzigartig ist, wenn Sie das Array durchlaufen, um die Seite anzuzeigen, die Sie durch das eindeutige Array durchlaufen können und nehmen Sie beim Rendern nur die doppelten Elemente aus dem ursprünglichen Array.

Beachten Sie Folgendes:

<?php 
    $array = array(); 
    $uniqueArray = array_unique($array); 
    for ($i = 0; $i < sizeof($uniqueArray); ++$i) { 
     if (in_array($uniqueArray[$i], $array)) { 
      // Item has duplicates 
     } else { 
      // item is unique 
     } 
    } 
?> 

Wenn Sie nicht wollen, Duplikate behalten Sie ganz einfach die gleiche Formel folgen, sondern ein Duplikat auf passenden, anstatt sie anzuzeigen Sie können jede von ihnen aus der Datenbank löschen Wenn nur einer beibehalten wird, wird das Objekt aus dem eindeutigen Array gerendert.

Verwandte Themen