2011-08-18 3 views
12

MySQL에서 제공된 데이터 중 2 개 필드 이상 일치하는 행을 선택하려고합니다MySQL 일치하는 5 개 필드 중 2 개

예 : 나는 firstName, lastName, dob, 웹 사이트, 이메일을 받았고 firstName과 lastName, firstName과 email 또는 웹 사이트와 이메일과 일치하는 행을 원합니다.

나는 매우 긴 감기 진술을 쓸 수 있음을 알고 있습니다. 의 선 (이것은이 =이이를 =) OR (이 등 하지만이 쿼리는 잠재적으로 우리가 5 개 이상의 필드를 일치시킬 결정 특히, 정말 큰 얻을 수 있습니다.

를이 = 우리는 또한 것이다 일치하는 행의 순위를 매길 필요가 있으므로 일부 행이 최소 2 개의 필드 대신 3과 일치하는 경우 반환 된 결과에서 더 높은 값을 표시해야합니다.

이 후 PHP로, 또는 여러 개의 SQL 쿼리를 수행하면 누구나이 데이터와 일치시킬 더 쉽고/깨끗한 방법을 알고 있는지 궁금 할 것입니다.

감사합니다. Jo

+0

내가 LONG SQL 훌륭한 일을 아무것도 – ajreal

답변

11

일치하는 표현식을 세어 볼 수 있습니다. MySQL은 true의 경우 1을 반환하고 false의 경우 0을 반환합니다.

WHERE (FirstName = ?) + (LastName = ?) + (... = ?) > 2 

또한 이것을 사용하여 주문할 수도 있습니다. 더 높은 성냥이 먼저 나타나도록 내림차순 정렬을 원할 것입니다.

ORDER BY ((FirstName = ?) + (LastName = ?) + (... = ?)) DESC 
+0

을 해칠 생각하지 않습니다, 감사합니다 :) – Joanne

4

답변으로 권장하는 값을 함께 추가 할 수 있습니다. 순위 지정에이 값을 사용하려면 해당 값을 where 절에 포함하지 않을 수도 있습니다.

SELECT *, ((firstName = @inputFirst) + (lastName = @inputLast) + (dob = @inputDob) + (website = @inputWebsite) + (email = @inputEmail)) as Matches 
FROM mytable 
HAVING Matches > 1 
ORDER BY Matches DESC 

현재이 구문을 테스트하기 위해 mysql db에 액세스 할 수 없지만 올바르게 작동해야합니다.

+0

이것은 당신이 WHERE''대신'HAVING'을 할 거라고 생각 제외하고 내가 무슨 생각입니다. – Wiseguy

+0

@wiseguy 왜? 여기서 그룹핑이 없으며, 주문 후 * * 필터링 할 필요가 없습니다. –

+1

'Matches'는 테이블의 실제 열이 아니기 때문에. 'WHERE'는 조건을 테이블 컬럼에 놓고, 'HAVING'은 조건을 결과 세트 컬럼에 놓습니다. – Wiseguy

-1
SELECT 
(CASE WHEN Field1 = Value1 THEN 1 ELSE 0 END 
+CASE WHEN Field2 = Value2 THEN 1 ELSE 0 END 
... 
+CASE WHEN FieldN = ValueN THEN 1 ELSE 0 END 
) 
AS Conditions 
From YourTable 
WHERE Conditions >= (Min_Number_Of_Fields)