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

    Есть ли способ, чтобы сделать этот запрос быстрее:Simplify/ускорить 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 (Firstname, '', фамилия) AS полный" вместо «(имя = '$ ПгвЬЫате' и фамилия = '$ lastname') AS full "? –

    +1

    @Paulo Я не думаю, что это то, что он собирается делать. Он хочет иметь логический эквивалент, когда будет полный матч. – cwallenpoole

    +0

    @Yes Christopher – Johnson

    ответ

    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

    взгляд в lucenehere). Это сделает релевантные запросы, с которыми это намного проще работать.

    +0

    Здесь нет ничего актуального. Я не знаю lucene, но я знаю Sphinx Search, и в этом случае это будет полностью переполнено. – AndreKR

    1

    SQL не соответствует вашему описанию, потому что SQL также найдет Megan McAllister, когда введены «Megan» и «F», потому что 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

    +0

    Спасибо за ваш ответ AndreKR. Тогда забыть о моем запросе, как бы вы сделали этот запрос (-и), если вы должны заполнить описание? Не могли бы вы показать мне, используя другой SQL для полного соответствия и так? – Johnson

    +0

    Это просто ГДЕ, которое я дал в ответ. И для логики я обновил ответ (я не думаю, что форматирование кода работает в комментариях) с предложением. И, пожалуйста, обратите внимание, что вы используете addlashes и htmlentities. – AndreKR

    Смежные вопросы