문제

가정하자는 두 개의 테이블이 있다: usersgroups.

어떻게 하나를 제공하"간단한 검색에서"사용자가 텍스트를 입력 및 결과 모두 포함 사용자와 그룹의 이름에 포함된 텍스트가 있습니까?

검색 결과를 구별해야하는 두 가지 유형이 있습니다.

도움이 되었습니까?

해결책

트릭은 결합 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%")

변환할 수 있$텍스트를 위한 경우 또는 단지 그것에서 쿼리를 실행합니다.이 방법으로 당신은 대소문자를 구분하지 않 검색합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top