php
  • mysql
  • 2010-11-05 94 views 0 likes 
    0

    有没有一种方法,使这个查询更快:简化/加快SQL查询

    $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); 
    
    } 
    
    +0

    它不应该是“CONCAT(名字,‘’,姓)为满”而不是“(名字=‘$姓名’和姓氏='$ lastname')完整“? – 2010-11-05 21:37:16

    +1

    @Paulo我不认为这就是他要做的。他想要一个完全匹配的布尔等值。 – cwallenpoole 2010-11-05 21:45:15

    +0

    @Yes克里斯托弗 – Johnson 2010-11-05 21:46:04

    回答

    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

    1

    直视lucene(和here)。它将使这样的相关查询更容易处理。

    +0

    这里没有关系。我不知道lucene,但我知道Sphinx Search,在这种情况下,这完全是矫枉过正。 – AndreKR 2010-11-05 21:46:36

    1

    SQL与您的描述不匹配,因为当“Megan”和“F”ist输入时,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'; 
    
    +0

    将事情分解成几个不同的查询并将其分解为多个条件会更容易和更一致。 – cwallenpoole 2010-11-05 21:47:19

    +0

    感谢您的回答AndreKR。那么忘了我的查询,那么如果你应该填写描述,你会怎么做这个查询?你能否给我展示使用另一个SQL进行完整匹配,等等? – Johnson 2010-11-05 21:47:56

    +0

    这只是我在答案中给出的地方。对于逻辑我更新了答案(因为我不认为代码格式在评论中起作用)并提出了一个建议。 请注意您使用addslashes和htmlentities。 – AndreKR 2010-11-05 22:20:37

    相关问题