簡體   English   中英

如果遇到條件,PHP會更改MySQL順序

[英]PHP Change MySQL Order By If Condition Met

我試圖改變MySQL結果的順序取決於PHP是否滿足if條件。

我的代碼檢查是否有任何行是duplicates ,如果是, duplicates改行類。

我想要實現的是,如果有重復,則MySQL查詢按Frequency排序,如果沒有找到重復項,則按Name排序。

這就是我所擁有的:

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;
    }
  }
}

現在我知道我的表包含重復項,但目前沒有任何突出顯示的行,順序是按Name

在我將代碼更改為上面提到的代碼之前,這個代碼突出了我的重復行:

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;
        }
   }
  }

我能做些什么來實現我想做的事情? 我想要更改順序的原因是因為當沒有重復時,優先按字母順序滾動列表,但如果有重復項, Frequency對其進行排序會將重復項放在另一行之后使其易於findedit/delete

基於你想要做的事情,我將構建一個結果的關聯數組,然后使用你的邏輯來使用PHP而不是MySQL的order by子句對它們進行order by

你可以采取(如果您想保留的所有副本)的方法是通過比較排序數組建表Name key ,然后說if unique display else for each duplicate in array display ,這將導致所有的副本是的連續顯示,整個事件按字母順序排序,您可以使用asort

為了阻止這種情況觸發副作用,你可以構建兩個數組,一個來自MySQL select ,另一個是使用array_unique獨特的,當你循環遍歷數組以顯示頁​​面時,你可以循環遍歷唯一的數組並只獲取渲染時原始數組中的重復元素。

考慮以下:

<?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
      }
  }
?>

如果您不想保留重復項,則可以完全按照相同的公式進行操作,但在匹配副本而不是顯示它們時,您可以從數據庫中清除它們中的每一個,只保留一個然后從唯一數組中呈現項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM