我有一个充满名字的数据库。我想搜索所有带有$name
的名字。但是,我希望以$name
作为名字的人首先出现。
例如$name = John
.
我的结果是:
- 亚历克斯·约翰·史密斯
- 安德鲁·迈克尔·约翰
- 约翰·凯斯
- 无名氏
我希望它们喜欢(名字上有它的结果,姓氏上的结果,其他结果):
- 约翰·凯斯
- 无名氏
- 安德鲁·迈克尔·约翰
-
亚历克斯·约翰·史密斯
$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"更大的字母开头。而且,它按相反的字母顺序排列。