【问题标题】:Sorting a MySQL query with ORDER BY or with PHP sort functions使用 ORDER BY 或 PHP 排序函数对 MySQL 查询进行排序
【发布时间】:2011-03-09 21:01:50
【问题描述】:

我有一个要按字母顺序排序的查询,但诀窍是我希望排序能够平等地对待两列。例如,如果first_col 的第一行等于applesecond_col 的第二行等于aardvark,我希望second_col 第二行的值列在之前 first_col 第一行的值。一个值(不是NULL'')将始终存在于second_col 的每一行中,但first_col 中的值可以是''。希望我已经解释得足够好。我不在乎是否必须为此使用 MySQL 或 PHP,但是一旦排序,数组就会被读取并回显到 HTML 表中。有什么想法吗?

编辑

这就是我现在的代码。在我的 MySQL 查询中,我需要 b_namel_name 相等。 b_name 列并不总是有值。当我将值放入表中时,它基于b_name 的存在。如果b_name 不存在,则将f_namel_name 组合起来替换b_name

                $query = "SELECT * FROM customers ORDER BY b_name, l_name";
                $result = mysql_query($query);
                mysql_close($link);

                $num = mysql_num_rows($result);                         

                for ($i = 0; $i < $num; $i++){

                    $row = mysql_fetch_array($result);

                    $class = (($i % 2) == 0) ? "table_odd_row" : "table_even_row";

                    if($row[b_name]!=''){
                        echo "<tr class=".$class.">";

                            echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[c_id]."</a></td>";
                            echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[b_name]."</a></td>";
                            echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[phone]."</a></td>";

                        echo "</tr>";

                    }

                    else{
                        echo "<tr class=".$class.">";

                            echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[c_id]."</a></td>";
                            echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[f_name]." ".$row[l_name]."</a></td>";
                            echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[phone]."</a></td>";

                        echo "</tr>";

                    }


                }

            ?>      

        </table>

【问题讨论】:

  • 如果第一行是'a','b',第二行是'b','a',并且两列被平等对待,那哪一行应该在前,为什么?
  • 向我们展示查询。通常,使用两列作为一列进行排序的唯一可靠方法需要使用 UNION

标签: php mysql sorting sql-order-by


【解决方案1】:

如果您的表格非常相似,您可以这样做

在我的情况下,我有一个表 test_a 有 2 列 idname

(SELECT * FROM test_a a1) 
UNION ALL 
(SELECT * FROM test_a a2) 
ORDER BY name DESC

【讨论】:

  • 我认为这是最好的解决方案。
【解决方案2】:

您的问题并不完全清楚,但您可以尝试将其用作您的 ORDER BY 子句:

ORDER BY LEAST(first_col, second_col)

演示:

CREATE TABLE table1 (first_col VARCHAR(100) NOT NULL, second_col VARCHAR(100) NOT NULL);
INSERT INTO table1 (first_col, second_col) VALUES
('a', 'b'),
('d', 'e'),
('f', 'c');

SELECT first_col, second_col
FROM table1
ORDER BY first_col, second_col;

a b
d e
f c

SELECT first_col, second_col
FROM table1
ORDER BY LEAST(first_col, second_col);

a b
f c
d e

【讨论】:

  • 这基本上是我所做的,但它不起作用,因为first_col 总是优先考虑,所以来自second_col 的所有内容都位于列表的底部。
  • @typoknig:根据你的问题,你写了ORDER BY first_col, second_col。这不一样。
  • @typoknig:通常结果不一样。我已经发布了一些示例代码,因此您可以看到情况就是这样。
  • 对不起,我应该更技术性...结果对我来说是一样的,因为 first_col 中的一些值是 '' 所以所有这些值都在顶部列表中的值,按second_col 的值排序,而first_col 中的所有值最终在列表底部相互排序。
【解决方案3】:

试试

ORDER BY CONCAT(b_name, l_name)

或(如果您的字段在 EMPTY 时为 NULL)

ORDER BY COALESCE(b_name, l_name)

【讨论】:

    【解决方案4】:

    正如上面所说,UNION ALL 是您的朋友,当然,如果您只有一张桌子,您总是可以这样做:

    (SELECT field1 AS name FROM TABLE1) 
    UNION ALL 
    (SELECT field2 AS name FROM TABLE1) 
    ORDER BY name DESC
    

    因此,您要求在同一个表中包含两个不同的行,并按原样对其进行排序。

    【讨论】:

      【解决方案5】:

      感谢您的所有帮助,但您的回答都不允许我对数据进行排序,并在排序后正确地将其回显到 HTML 表中。 UNION 可能有效,但我认为我的解决方案在解决所有问题时更快。

                      $query = "SELECT c_id, b_name, l_name, f_name, phone FROM customers";
                      $result = mysql_query($query);
                      mysql_close($link);
      
                      $num = mysql_num_rows($result);
      
                      for ($i = 0; $i < $num; $i++){
                          $row = mysql_fetch_array($result);
      
                          if($row[b_name]!=''){
                              $new_result[$i]['c_id'] = $row[c_id];
                              $new_result[$i]['c_name'] = $row[b_name];
                              $new_result[$i]['phone'] = $row[phone];
                          }
      
                          else{
                              $new_result[$i]['c_id'] = $row[c_id];
                              $new_result[$i]['c_name'] = $row[l_name].", ".$row[f_name];
                              $new_result[$i]['phone'] = $row[phone];                         
                          }
                      }                       
      
                      foreach ($new_result as $key => $row) {
                         $c_id[$key]  = $row['c_id'];
                         $c_name[$key] = $row['c_name'];
                         $phone[$key] = $row['phone'];
                      }
      
                      array_multisort($c_name, SORT_ASC, $c_id, SORT_ASC, $new_result);   
      
                      for ($i = 0; $i < $num; $i++){
      
                          $class = (($i % 2) == 0) ? "table_odd_row" : "table_even_row";
      
                          echo "<tr class=".$class.">";
      
                              echo "<td><a href=Edit_Customer.php?c_id=".$new_result[$i]['c_id'].">".$new_result[$i]['c_id']."</a></td>";
                              echo "<td><a href=Edit_Customer.php?c_id=".$new_result[$i]['c_id'].">".$new_result[$i]['c_name']."</a></td>";
                              echo "<td><a href=Edit_Customer.php?c_id=".$new_result[$i]['c_id'].">".$new_result[$i]['phone']."</a></td>";
      
                          echo "</tr>";                       
      
                      }
      
                  ?>      
      
              </table>
      

      【讨论】:

      • 选择整个表更快?好吧。祝你的服务器好运。
      • @Col。 Sharpnel,您应该再看一下我回答中的查询。我没有选择整个表格,只选择了我需要的字段。
      • 哈哈,你是个有趣的家伙 :) 字段没有任何意义,而行就是一切。
      • 请给我解释一下,因为我不明白你在说什么。对我来说,我在答案中发布的解决方案似乎对我来说是一个很好的解决方案。我需要我选择的列的所有行,并且我使用 PHP 函数 array_multisort 成功地对它们进行了排序,并完全按照我的需要将它们回显到一个表中。与另一种替代方案(很可能需要我重组数据库)相比,这对服务器来说有什么不好或压力更大?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      相关资源
      最近更新 更多