首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP更改MySQL Order By If条件满足

问PHP更改MySQL Order By If条件满足
EN

Stack Overflow用户
提问于 2017-03-12 13:30:21
回答 1查看 156关注 0票数 1

我正在尝试更改MySQL结果的顺序,这取决于PHP中是否满足if条件。

我的代码检查是否有行是duplicates的,如果是,则更改row类。

我试图实现的是,如果存在重复项,则MySQL查询按Frequency排序,如果没有找到重复项,则按Name排序。

这就是我所拥有的:

代码语言:javascript
复制
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排序的。

在我将我的代码更改为上面提到的代码之前,它确实高亮显示了我的重复行:

代码语言:javascript
复制
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排序会将重复项排成一行,以便于find和edit/delete。

EN

回答 1

Stack Overflow用户

发布于 2017-03-12 14:11:03

根据您正在尝试做的事情,我将构建一个结果的关联数组,然后使用您的逻辑对它们进行排序,使用PHP而不是MySQL的order by子句。

您可以采用的一种方法(如果您想保留所有重复项)是通过按Name key对数组进行排序,然后说if unique display else for each duplicate in array display来构建表,这将导致所有重复项连续显示,整个内容按名称的字母顺序排序,您可以使用asort来执行此操作。

为了避免触发副作用,您可以构建两个数组,一个来自MySQL select,另一个是使用array_unique的唯一数组。这样,当您循环遍历数组以显示页面时,您可以循环遍历唯一的数组,并且在呈现时仅获取原始数组中的重复元素。

请考虑以下几点:

代码语言:javascript
复制
<?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
      }
  }
?>

如果您不想保留重复项,您可以非常简单地遵循相同的公式,但是在匹配重复项时,您可以从数据库中清除每个重复项,只保留一个,然后从唯一数组中呈现项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42744145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档