2009-09-10 4 views
1

나는 부동산 중개업자와 세입자를위한 웹 사이트를 구축 중입니다. 세입자는 Street, Town 및 Postcode를 포함한 등록 정보를 원하는 위치에 등록하고 채울 수 있습니다. 일단 가입하면 검색 기준과 일치하는 등록 정보를 가진 상담원에게 자동으로 이메일을 보냅니다.사용자 입력을 기반으로 일치하는 값을 찾기위한 SQL 쿼리

현재 스트리트, 타운 또는 우편 번호 중 하나와 일치하도록 쿼리를 다음과 같이 설정했습니다.

<% 
Dim rspropertyresults 
Dim rspropertyresults_numRows 

Set rspropertyresults = Server.CreateObject("ADODB.Recordset") 
rspropertyresults.ActiveConnection = MM_dbconn_STRING 
rspropertyresults.Source = "SELECT * FROM VWTenantPropertiesResults " 

'WHERE  (ContentStreet = 'Holderness Road') OR (ContentTown = 'Hull') OR (ContentPostCode = 'HU') 

rspropertyresults.Source = rspropertyresults.Source& "WHERE (ContentStreet = '" & Replace(rspropertyresults__varReqStreet, "'", "''") & "'" 

rspropertyresults.Source = rspropertyresults.Source& "OR ContentTown = '" & Replace(rspropertyresults__varReqTown, "'", "''") & "' " 
rspropertyresults.Source = rspropertyresults.Source& "OR ContentTrimmedPostCode = '" & Replace(varPostcode, "'", "''") & "') " 

rspropertyresults.Source = rspropertyresults.Source& "AND ((ContentBedRooms >= " & Replace(rspropertyresults__varBedroomsNoMin, "'", "''") & " " 
rspropertyresults.Source = rspropertyresults.Source& "AND ContentBedRooms <= " & Replace(rspropertyresults__varBedroomsNoMax, "'", "''") & ") " 

rspropertyresults.Source = rspropertyresults.Source& "AND (ContentPrice > = " & Replace(rspropertyresults__varPriceMin, "'", "''") & " " 
rspropertyresults.Source = rspropertyresults.Source& "AND ContentPrice <= " & Replace(rspropertyresults__varPriceMax, "'", "''") & ")) " & varSQL & " " 

rspropertyresults.Source = rspropertyresults.Source& "ORDER BY ContentPrice " & Replace(rspropertyresults__varSortWay, "'", "''") & " " 

rspropertyresults.CursorType = 0 
rspropertyresults.CursorLocation = 2 
rspropertyresults.LockType = 1 
rspropertyresults.Open() 

rspropertyresults_numRows = 0 
%> 

그러나 클라이언트는 대신 값 중 하나에 일치하는, 그것은이 말 거리와 타운 일치, 그 부동산 에이전트를 이메일을 보내거나하면 그런 방법으로 일을해야한다고 요청했습니다 타운 및 우편 번호 경우 일치 한 다음 해당 속성 에이전트에게 이메일을 보냅니다.

상상할 수 있듯이 쿼리가 매우 복잡해 질 것이라고 생각하지만이 같은 쿼리를 가장 효과적으로 디자인하는 방법은 확실하지 않습니다.

누군가 올바른 방향으로 나를 도울 수 있는지 궁금해하던가요?

답변

4
SELECT * 
FROM (
     SELECT id 
     FROM (
       SELECT id 
       FROM VWTenantPropertiesResults 
       WHERE ContentStreet = 'Holderness Road' 
       UNION ALL 
       SELECT id 
       FROM VWTenantPropertiesResults 
       WHERE ContentTown = 'Hull' 
       UNION ALL 
       SELECT id 
       FROM VWTenantPropertiesResults 
       WHERE ContentPostCode = 'HU' 
       ) qi 
     GROUP BY 
       id 
     HAVING COUNT(*) >= 2 
     ) q 
JOIN VWTenantPropertiesResults r 
ON  r.id = q.id 
WHERE ContentBedrooms BETWEEN 1 AND 4 
     AND ContentPrice BETWEEN 50 AND 500 
ORDER BY 
     ContentPrice 

적어도 2 조건이 일치하는 모든 레코드를 반환합니다.

이 해결 방법은 OR 절과 달리 ContentStreet, ContentTownContentPostCode에 대한 인덱스를 사용합니다. 최상의 성능과 보안을 위해

는, 바인딩 매개 변수로 치환 된 매개 변수 값을 대체합니다

성능 세부 사항에 대한 내 블로그에서이 항목을 참조하십시오.

이렇게하면 쿼리 구문 분석에 시간을 절약 할 수 있으며 SQL 주사로부터 보호 할 수 있습니다.

+1

+1 : 좋은 해결책 - 어쨌든 ID별로 그룹화했기 때문에 UNION ALL이이 경우 더 좋을까요? – RedFilter

+0

안녕하세요 Quassnoi, 해결책 주셔서 감사합니다. 나는 이것이 올바르게 실행되는지를보기 위해 먼저 이것을 시도했다. (나는 id를 ContentID로 변경했다.) 실행되지만 결과는 반환하지 않습니다. 결과에 영향을주는 다른 것이있을 수 있습니다. 2 ~ 3 가지 조건과 일치하는 데이터가 분명히 있음을 알고 있습니다. – doubleplusgood

+0

'@ OrbMan' : 맞아요, 고마워요. 뿐만 아니라 쿼리가 올바로 작동하도록 요구됩니다. – Quassnoi

3

웹 사이트에 SQL을 포함시키는 것은 실용적인 IMO입니다. 하지만 asp-classic에 익숙하지 않습니다. 또한 당신이하는 방법은 당신이 SQL 주입 위험이 있습니다. UI와 데이터 액세스 논리를 섞지 마십시오. http://en.wikipedia.org/wiki/SQL_injection

+0

별도의 모델 계층, 매개 변수가있는 쿼리, 연결이 끊어진 레코드 집합, 연결 풀링 등과 같은 모범 사례를 사용하지 못하도록하는 ASP 클래식에는 없습니다. – RedFilter

1

에서

봐 당신이 설명한 논리를 처리하기 위해 저장 프로 시저는 SQL을 만드는 것이 좋습니다 것입니다. ASP 코드에서 사용자가 제공 한 매개 변수를 사용하여이 프로 시저를 호출 할 수 있습니다. 이렇게하면 동적으로 SQL을 작성하는 문제를 피할 수 있으며이 문제를 좀 더 쉽게 해결할 수 있습니다.

저장 프로 시저와 함께 ADODB를 사용하는 몇 가지 예는 http://authors.aspalliance.com/stevesmith/articles/sprocs.asp을 참조하십시오.

+0

매개 변수화 된 쿼리를 구현하기 위해 저장 프로 시저를 사용할 필요가 없습니다. – RedFilter

+0

사실입니다. 저는 OP가 달성하고자하는 목표에 영향을주기 위해보다 깨끗하고 집중된 방법으로 SP를지지합니다. –

0

비슷한 상황에서 사용한 접근 방법은 column = value가 아닌 LIKE를 사용하면 모든 필드 조합에서 모든 값을 사용할 수 있다는 것입니다. 예 :

도시명 ('%'+ @town + '%') 및 우편 번호 ('%'+ @zip '%')와 거리 등 ('%'+ @ 스트리트 '%') AND etc

필드의 일부만 입력 했어도 유효한 결과가 반환되는 것은 중요하지 않습니다.이 접근 방식의 주된 단점은 LIKE가 숫자 유형 열과 함께 작동하지 않으므로 모든 필드가 문자열 값이되어야한다는 것입니다. 따라서 숫자 필드에서 일부 캐스팅을 수행해야하는데 변환이 얼마나 필요한지에 따라 문제가 발생할 수 있으므로 상황을 파악하고 처리해야합니다.

나는이 사실이 검색 할 필드의 매개 변수를 전달하는 저장 프로 시저에서 수행되어야한다는 데 동의합니다.

관련 문제