【问题标题】:mysqli - order by name I'm searchingmysqli - 按我正在搜索的名称排序
【发布时间】:2014-12-27 22:14:18
【问题描述】:

我有一个充满名字的数据库。我想搜索所有带有$name 的名字。但是我希望以$name 作为名字的人首先出现。

例如$name = John

我的结果是:

  1. 亚历克斯·约翰·史密斯
  2. 安德鲁·迈克尔·约翰
  3. 约翰·凯斯
  4. 约翰·多伊

我希望他们喜欢(名字上有它的结果,姓氏上有它的结果,其他结果):

  1. 约翰·凯斯
  2. 约翰·多伊
  3. 安德鲁·迈克尔·约翰
  4. 亚历克斯·约翰·史密斯

    $name = $_POST['text_search'];
    
    $sql = <<<SQL
            SELECT *
            FROM `teachers`
            WHERE `name` LIKE '%{$name}%' ORDER BY `name` ....
    SQL;
    

我如何订购它们?

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    您可以在 PHP 中订购(请参阅@siniradam 的回答)...或者您可以直接在 SQL 中订购:

    如果您希望它们按原始顺序(但名字在前)

      SELECT `name`
        FROM `teachers`
        WHERE `name` LIKE '{$name}%' 
    
      UNION
    
      SELECT `name`
        FROM `teachers`
        WHERE `name` LIKE '%{$name}%' ORDER BY `name`
        AND   `name` NOT LIKE '{$name}%' 
    

    如果您希望它们在 2 个子集中按字母顺序排列:

      SELECT `name`, 0 `is_not_first`
        FROM `teachers`
        WHERE `name` LIKE '{$name}%' 
    
      UNION
    
      SELECT `name`, 0 `is_not_first`
        FROM `teachers`
        WHERE `name` LIKE '%{$name}%' ORDER BY `name`
        AND   `name` NOT LIKE '{$name}%' 
    
      ORDER BY `is_not_first`, `name`
    

    警告 - 如果表非常大,SQL 中的这种方法比纯 PHP 方法慢,因为它基本上查询表两次。不过,在较小的桌子上也一样好。

    【讨论】:

      【解决方案2】:

      嗯,这可能对你有用。

      $q = "John";
      $result = array(
          "Alex John Smith",
          "Andrew Michael John",
          "John Case",
          "John Doe"
      );
      
      function cmp($a, $b){
          GLOBAL $q;
          if ($a == $b) {
              return 0;
          }
          return (strpos($a, $q) < strpos($b, $q)) ? -1 : 1;
      }
      
      print_r($result);
      usort($result, "cmp");
      print_r($result);
      

      这是结果;

      Array
      (
          [0] => Alex John Smith
          [1] => Andrew Michael John
          [2] => John Case
          [3] => John Doe
      )
      Array
      (
          [0] => John Case
          [1] => John Doe
          [2] => Alex John Smith
          [3] => Andrew Michael John
      )
      

      【讨论】:

        【解决方案3】:

        我不太确定,但试试这个:仅在 $name 的一侧添加 % 符号

        $sql = mysqli_query($con, 'SELECT * FROM teachers WHERE name LIKE '.$name.'% ORDER BY name');
        

        UPD。因为我还不能发表评论。 Jan Fickos 的回答不正确。它之所以有效,是因为在您的示例中,没有以大于“J”的字母开头的名字。而且,它的字母顺序是相反的。

        【讨论】:

        • 这并不比 Jan 的回答好 - 你不会得到中间没有搜索词的名字。
        猜你喜欢
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 2020-05-05
        • 2020-10-24
        • 1970-01-01
        相关资源
        最近更新 更多