2008-09-11 4 views

답변

3

트릭은 UNION을 리터럴 문자열과 결합하여 반환되는 'object'유형을 결정하는 것입니다. 대부분의 (?) 경우 UNION ALL이 더 효율적이며 하위 쿼리에서 중복이 필요하지 않으면 사용해야합니다. 좋은 해결책을 찾을 수 없습니다, 어제이 문제를 건너 왔어요 때문에 나는 대답에게 자신을 추가 한,이 방법을 사용 :

SELECT "group" type, name 
    FROM groups 
    WHERE name LIKE "%$text%" 
UNION ALL 
SELECT "user" type, name 
    FROM users 
    WHERE name LIKE "%$text%" 

참고을 다음 패턴은 충분합니다. 누군가 더 나은 접근 방법을 가지고 있다면 언제든지 추가하십시오.

1

"UNION ALL"을 사용하면 db가 중복 제거를 시도하지 않습니다. 첫 번째 열이 다르기 때문에 두 쿼리간에 중복이 없으므로 UNION ALL이 빠릅니다.
(제거 할 각 쿼리 내에 중복이 없다고 가정)

+0

감사합니다. 효율 (아직)을 테스트하지는 않았지만 동일한 결과를 산출하지만, 당신이 말하는 것은 완벽한 의미를 갖습니다. 실제로는 기본 키도 선택하고 있습니다. –

1

LIKE를 사용하면 LIKE 비교기가 a로 시작될 때마다 테이블을 스캔해야하므로 많은 문제가 발생할 수 있습니다. %. 이렇게하면 SQL이 모든 단일 행을 검사하여 비교를 위해 사용중인 문자열을 통해 바이트 단위로 작업을 수행합니다. 시작하면 이것이 좋을 수도 있지만, 빠르게 스케일링 문제가 발생합니다.

더 나은 방법은 전체 텍스트 검색을 사용하는 것입니다. 이 옵션은 더 복잡한 옵션이지만 매우 큰 데이터베이스의 경우 더 나은 결과를 제공합니다. 그런 다음 Bobby Jack이 제공 한 예제의 작동 버전을 사용하여 UNION ALL 두 개의 결과 세트를 함께 표시하고 결과를 표시 할 수 있습니다.

+0

물론, "간단하다"에 의해 나는 이것들이 매우 작은 테이블이고, 응용 프로그램이 무차별적인 LIKE 검색이 완벽하게 받아 들여질 수 있다는 것을 의미한다고 생각합니다. 활동을 느리게 할 때이 점과 다른 점을 명확히하기 위해 질문을 편집 할 것입니다. 건배. –

1

내가 먼저 대문자로 $ 텍스트를 변환 할 수 있습니다 또는 쿼리에 다만 않는 또 다른 외에도에게

SELECT "group" type, name 
    FROM groups 
    WHERE UPPER(name) LIKE UPPER("%$text%") 
UNION ALL 
SELECT "user" type, name 
    FROM users 
    WHERE UPPER(name) LIKE UPPER("%$text%") 

을 제안합니다. 이렇게하면 대소 문자를 구분하지 않고 검색 할 수 있습니다.

+0

LIKE의 대/소문자 구분은 데이터베이스에 따라 다릅니다 (그리고 심지어 데이터 정렬 일 수도 있습니다). 어쨌든 LIKE 비교가 대소 문자를 구분하지 않는 MySQL을 사용하고 있습니다. –

관련 문제