简化/加速SQL查询

时间:2010-11-05 21:28:48

标签: php mysql

有没有办法让这个查询更快:

$qur = mysql_query("
 SELECT id, firstname, lastname, 
 (firstname = '$firstname' AND lastname = '$lastname') AS full FROM users 
 WHERE (firstname = '$firstname' AND lastname='$lastname') 
 OR (firstname LIKE '$firstname%' AND lastname LIKE '$lastname%')
 OR firstname LIKE '$firstname%' OR lastname LIKE '$firstname%'
 ORDER BY (firstname = '$firstname' AND lastname='$lastname') DESC");

我需要的是:

Check if its a full match.
Get firstname lastname
Being able to only enter lastname "Fox" and let it find the firstname (get all users with lastname Fox, and show their firstname too and display check the script at bottom.)
Being able to only enter the firstname "Megan" and let it find the lastname (^)
Being able to only enter Megan F, and let it show "Megan Fox"
Being able to only enter Me Fox, and let it show "Megan Fox"

这就是它对我的作用,没有任何问题。虽然也许我认为当很多用户运行它时会运行缓慢

我正在使用它:

 if (mysql_num_rows($qur) == 1) {

 $get = mysql_fetch_array($qur);
    if($get["full"] == 1){
    echo $get["id"];
    }else{
     echo "Did you mean: ".$get["firstname"]." ".$get["lastname"]." ?";
    }
 }elseif(mysql_num_rows($qur) > 1){
    while($get = mysql_fetch_array($qur)) {
       $name[] = $get["firstname"]." ".$get["lastname"];
   }

   if(count($name) > 1) {
       echo 'Who did you mean?<br>';
   } else {
       echo 'Did you mean: ';
   }
   echo implode('<br>', $name);

 } 

3 个答案:

答案 0 :(得分:1)

查看lucene(和here)。它会使这样的相关性查询更容易使用。

答案 1 :(得分:1)

您可以将查询缩短为:

$qur = mysql_query(
"SELECT id, firstname, lastname, 
 (firstname = '$firstname' AND lastname = '$lastname') AS full FROM users 
 WHERE firstname LIKE '$firstname%' AND lastname LIKE '$lastname%' 
 ORDER BY (firstname = '$firstname' AND lastname='$lastname') DESC");

LIKE '...%'这里涵盖了所有案例。但除此之外,也许你应该研究MyISAM's FULLTEXT search,这可能会产生更好的结果。

PS:我希望您在将$firstname$lastname插入查询之前对其进行转义!

答案 2 :(得分:1)

SQL与您的描述不匹配,因为当输入“Megan”和“F”时,SQL也会找到Megan McAllister,因为OR firstname LIKE '$firstname%'足以满足条件。

您的描述会转换为SQL:

WHERE firstname LIKE '$firstname%' AND lastname LIKE '$lastname%'

我认为你必须将“完全匹配”逻辑放在另一个SQL中,否则你必须在第一遍中突破循环/迭代结果以检查它是否是完全匹配。想想有一个Mega Fox和Megana Foxy的情况:你会得到两行,虽然一个完整的匹配。

以下是对“完全匹配”逻辑的建议:

unset($name); unset($id);

while ($get = mysql_fetch_array($qur))
{
    $name []= $get["firstname"]." ".$get["lastname"];
    if ($get['full'])
    {
        $id = $get['id'];
        break;
    }
}

if ($id)
    echo $id;
elseif ($name)
    echo implode('<br>', $name);
else
    echo 'Nothing found';