문제
가정하자는 두 개의 테이블이 있다: users
고 groups
.
어떻게 하나를 제공하"간단한 검색에서"사용자가 텍스트를 입력 및 결과 모두 포함 사용자와 그룹의 이름에 포함된 텍스트가 있습니까?
검색 결과를 구별해야하는 두 가지 유형이 있습니다.
해결책
트릭은 결합 UNION
과 문자열을 결정하는 형식의'object'반환됩니다.에서 가장(?) 경우에,동맹의 모든 것이 더 효율적이고,사용되어야 하지 않으면 중복에 필요한 서브 쿼리를 처리합니다.다음과 같은 패턴이 충분해야 합:
SELECT "group" type, name
FROM groups
WHERE name LIKE "%$text%"
UNION ALL
SELECT "user" type, name
FROM users
WHERE name LIKE "%$text%"
참고:추가했 나 자신에 대답하기 때문에,이 문제가 어제는 찾을 수없이 좋은 솔루션과 이 방법을 사용했습니다.누군가가 있다면 더 나은 방법을 주시기 바랍니다.
다른 팁
당신이 사용하는 경우"UNION"모두 다음 db 지 않을 제거하려고 중복-당신은 없을 것이 중복 사이의 두 개의 쿼리 어쨌든(이후 첫 번째 열 다),그 동맹의 모든 것이 빠르게 할 수 있습니다.
(나는 가정하지 않는 것이 중복 안에 각각하는 쿼리를 제거할)
를 사용하여 다음과 같이 다수 문제를 일으킬 것으로 필요한 표 검사는 모든 단일 시간 때 같은 비교 측정기로 시작%.이 힘을 SQL 을 확인 매 단 하나 줄이고 작업 그것의 방법에서는 바이트 단위로를 통해 문자열을 사용하는을 위한 비교입니다.이 좋은 있을 수 있습니다,당신은 시작할 때 빠르게 발생 scaling 문제입니다.
을 처리하는 더 좋은 방법이 사용하는 전체 텍스트 검색합니다.는 것이 더 복잡한 옵션을 제공할 것입니다 더 나은 결과에 대한 데이터베이스가 있습니다.당신은 사용할 수 있는 기능을 제공하는 버전의 예비 잭게 당신 UNION ALL
당신의 두 가지 결과가 세트를 함께 결과를 표시합니다.
는 것이 좋 또 다른 추가
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%")
변환할 수 있$텍스트를 위한 경우 또는 단지 그것에서 쿼리를 실행합니다.이 방법으로 당신은 대소문자를 구분하지 않 검색합니다.