2014-12-27 51 views
1

我有一个名字满满的数据库。我想在其中搜索$name的所有名字。不过,我希望以$name为名的人首先出现。例如。mysqli - 按名称排序我在寻找

而且我的结果是:

  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; 
    

我怎样才能订购它们?

回答

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的方法慢,因为它基本上查询表两次。然而,在较小的桌子上它同样好。

-1

我真的不知道,但尝试这个办法:%添加符号只为$一面命名

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

UPD。由于我无法评论。扬·菲克斯的回答是不正确的。它的工作原理是因为在你的例子中,没有比“J”更大的字母开头的名字。而且,它的字母顺序也是相反的。

+0

这并不比Jan的答案更好 - 你不会得到中间没有搜索词的名称。 – DVK

+0

@DVK可以为你+1,谢谢指出 – lolbas

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 
)