문제

FirstName> Middlename> LastName 계층 (질문을 위해 ~ 10k 행)이 있다고 가정 해 봅시다. 이것은 "John> Mary-Anne> Eddy"또는 "Eddy> John> Jacob"행을 가질 수 있음을 의미합니다. 요점은 계층 구조가 거의 의미가 없으며 사용자에게 매우 이질적이라는 것입니다 (예 : 국가> 상태> 도시 구조와 달리).

너무 구조화되지 않고 혼란스러워서 사용자에게 자동 완전한 입력 상자를 제공하고 싶습니다. 입력 할 때 가능한 하위 문자열 일치를 검색해야하며 검색 문자열을 "루트"하면 결과를 해당 레벨 아래로 제한합니다.

이제 "John"이라는 사람들이 많기 때문에 "John"을 입력하면 결과 만 다시 얻는다는 것은 말이되지 않습니다.

  • 존> 앨런> 알렉산더
  • John> Allen> Burschawitz
  • John> Allen ... 100 번 반복 ...

그들은 "Jason> John> Smith"독특한 행을 볼 수 없기 때문입니다.

대신, 그들은 ( "*"는 "이봐,이 아래에있는 더 많은 행 더 많은 행"을 사용자에게 임의의 지표 일뿐입니다.

  • John> Allen> *
  • 제이슨> 존> 스미스
  • Mike> John> *
  • Mary> Elena> Johnason

그들이 "John> al"을 입력하면 결과는 "John>"아래에있는 것으로 제한되지만 위와 유사하게 그룹화해야합니다.

설명이 분명하기를 바랍니다. 요구 사항은 약간 느슨합니다. 사람이 나무를 통해 검색하고 자신이 무엇을 찾을 수 있는지 합리적인 사람 만 있습니다.

지금, 나는 행에서 검색어를 찾는 흥미로운 SQL을 가지고 있으며, 위치를 파악하고, 일부 하위 문자열, 그룹 bys 및 주문을 수행하여 위의 결과를 얻을 수는 있지만 충분히 성능이 좋지 않습니다.

일반적인 램프 스택 에서이 문제를 해결하려고합니다 (Oracle 제외). 공유 호스팅이 아니므로 서버를 완전히 제어합니다. 데이터는 몇 주마다 적은 금액을 변경하고 검색 결과는 합리적인 시간 동안 오래 지속될 수 있습니다 (예 : 검색 인덱스가 문제가되지 않는 업데이트되는 CRON).

도움이 되었습니까?

해결책

아르. 내 문제를 설명 할 수 없어서 죄송합니다. 어쨌든, 여기 내가 생각해 낸 해결책이 있습니다.

기본적으로, 계층 구조의 각 연속 레벨에 대한 모든 뚜렷한 값을 포함하는 3 열 테이블과 계층 구조에서 해당 행의 깊이를 나타내는 열을 포함하는 두 번째 테이블을 만듭니다.

예를 들어 mytable(A, B, C), 만들다 search_t(A, B, C, level)

따라서 "1> 2> 3"을 사용하면 3 행 (A, B, C, Level)을 만듭니다.

  • "One", Null, Null, 1
  • "One", "Two", Null, 2
  • "One", "Two", "Three", 3

검색 할 때 레벨 값을 선택하고 상위 레벨 열에 대한 값을 제공하여 레벨을 제한 할 수 있습니다.

WHERE A='One' and level > 1 and (B like '%t%' or C like '%t')

당신이 만들면 약간 단순화되고 일반적 일 수 있습니다. search_str 열을 수행하고 수행하십시오 LIKE 대신 그것과 일치합니다.

WHERE A='One' and level > 1 and search_str like '%t%'

돌이켜 보면, 데이터가 이미 인접한 목록 모델에 있다면 이것은 아마도 더 분명했을 것입니다.

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