2014-12-27 56 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 
)