按名称排序 我正在搜索


order by name I'm searching

我有一个充满名字的数据库。我想搜索所有带有$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 中订购(请参阅@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的方法慢,因为它基本上查询表两次。然而,在较小的桌子上,它同样好。

嗯,这可能适合你。

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

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

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

上。由于我还无法发表评论。扬·菲科斯的回答是不正确的。它之所以有效,是因为在您的示例中,没有名字以比"J"更大的字母开头。而且,它按相反的字母顺序排列。