2011-11-16 4 views
0

아래의 SQL 쿼리를 참조하십시오. 정상적으로 작동하는 것 같습니다. 우편 번호 나 마을을 통해 기록을 검색 할 수 있습니다.SQL 쿼리를 향상시키는 방법

텍스트 입력란의 우편 번호 나 도시에있는 사용자 유형.

uk_postcodes 테이블의 우편 번호 목록 (BB1, BB2, BB3 등)이 있습니다.

사용자가 BB2 또는 BB2 XXX을 입력하면 BB2 영역에 배달하는 상점 기록 목록이 표시됩니다. Blackburn에서 사용자 유형은 다음이 기본 배달 지역과 상점의 목록이 표시됩니다 (D.shop_id = S.shop_id AND D.postcode_id = S.postcode_id)

$SQL = "(SELECT DISTINCT S.*, D.delivery_cost, D.postcode AS DeliveryAreaPostcode FROM shops AS S 
       JOIN shop_delivery_area AS D ON D.shop_id = S.shop_id 
       JOIN uk_postcodes AS P ON P.postcode_id = D.postcode_id 
        WHERE P.postcode = '$search' ORDER BY D.postcode) 
       UNION 
    (SELECT DISTINCT S.* , D.delivery_cost, D.postcode AS DeliveryAreaPostcode FROM shops AS S 
       JOIN shop_delivery_area AS D ON D.shop_id = S.shop_id AND D.postcode_id = S.postcode_id 
       JOIN uk_postcodes AS P ON P.postcode_id = D.postcode_id 
        WHERE S.town = '$search')"; 

인가

(나는 그것이 SQL 쿼리에 들어가기 전에 우편 번호의 첫 번째 부분을 얻기 위해 PHP를 사용) 이 SQL 쿼리는 좋은가요? 또는 무엇을 개선하거나 더 작게 만들 수 있습니까?

답변

1

는 하나 개의 제어 변수를 사용할 수 있습니다 별개의 검사를 수행 할 필요가 없기 때문에 UNION을 사용하는 것보다 빠릅니다. 이 경우에는 우편 번호 인 마을에 누군가가 살지 않는 한 그런 오버 헤드가 필요하지 않습니다!

1

당신은

$SQL = "SELECT DISTINCT S.*, D.delivery_cost, D.postcode AS DeliveryAreaPostcode 
     FROM shops AS S 
      JOIN shop_delivery_area AS D ON D.shop_id = S.shop_id 
      JOIN uk_postcodes AS P ON P.postcode_id = D.postcode_id 
     WHERE (P.postcode = '{0}' and '{1}' = 'postcode') 
     or (S.town = '{0}' and D.postcode_id = S.postcode_id and '{1}' = 'town') 
      ORDER BY D.postcode".format($search, $myflagcontrol); 

$의 myflagcontrol 현재 사용자의 선택에 대한 확정 얼마나 일부

형식은 UNION ALL이 사용 더미 여기에 기능 코드

// Add format extension to string class 
String.prototype.format= function(){  
var str = this; 
for (var i = 0, l = arguments.length; i < l; i++) 
    str = str.replace("{" + i + "}", arguments[i]); 
return str; 
} 
관련 문제