我有一个充满名字的数据库。我想在其中搜索$name
的所有名称。但是,我希望以$name
作为名字的人首先出现。
例如$name = John
。
我的结果是:
我想要他们(结果是名字,结果是姓氏,其他结果):
Alex John Smith
$name = $_POST['text_search'];
$sql = <<<SQL
SELECT *
FROM `teachers`
WHERE `name` LIKE '%{$name}%' ORDER BY `name` ....
SQL;
我如何订购?
答案 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”的字母开始。而且,它的字母顺序相反。