mysqli - 按名称命令我正在搜索

时间:2014-12-27 22:14:19

标签: php mysqli

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

例如$name = John

我的结果是:

  1. Alex John Smith
  2. Andrew Michael John
  3. John Case
  4. John Doe
  5. 我想要他们(结果是名字,结果是姓氏,其他结果):

    1. John Case
    2. John Doe
    3. Andrew Michael John
    4. Alex John Smith

      $name = $_POST['text_search'];
      
      $sql = <<<SQL
              SELECT *
              FROM `teachers`
              WHERE `name` LIKE '%{$name}%' ORDER BY `name` ....
      SQL;
      
    5. 我如何订购?

3 个答案:

答案 0 :(得分:1)

嗯,这可能适合你。

$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
)

答案 1 :(得分: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 :(得分:-1)

我不太确定,但试试这个:只将%符号添加到$ name

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

UPD。由于我无法发表评论。 Jan Fickos的回答不正确。它起作用,因为在你的例子中没有名字从大于“J”的字母开始。而且,它的字母顺序相反。