2010-06-04 9 views
2

내 MySQL의 질의는 다음과 같다 :FIND_IN_SET을 제거하기 위해 쿼리를 다시 작성 하시겠습니까?

SELECT pages.*, 
      showcase.*, 
      project.*  
     FROM pages 
INNER JOIN showcase ON showcase.pid = pages.uid AND showcase.deleted != 1 
INNER JOIN project ON FIND_IN_SET(project.uid, showcase.projects) 
    WHERE pages.deleted != 1 
     AND pages.pid = 14 
     AND pages.dokType = 150 

문제는 제 INNER JOIN는 - 쉼표 필드 showcase.projects으로 분리 된리스트로서 쇼케이스 (= 프로젝트 컬렉션)의 프로젝트를 저장하고 있기 때문에 FIND_IN_SET를 이용한다. FIND_IN_SET 캔트는 내가 아는 한 인덱스를 사용하므로 두 번째 조인에는 프로젝트 테이블의 전체 테이블 스캔이 필요합니다. 데이터베이스 스키마를 변경하지 않고 인덱스를 사용할 수 있습니까?

답변

0

다른 문자열 안에 '문자열'을 검색하면 색인을 사용하여 검색해야합니다. project_idshowcase_id의 열이있는 새 테이블 showcase_projects을 만듭니다. 그러면 두 테이블 간의 모든 연결에 대한 레코드가 생성됩니다.

이제이 대답은이 쿼리의 데이터 구조에 대한 기본적인 이해를 기반으로합니다.

+0

맞을 것 같아요, 월요일에 데이터를 표준화하기 시작할 것입니다. 확실히 최고의 솔루션. – Max

+0

행운을 비네. 정상화의 최후 순간을 지키지 말자. 그것은 미래의 데이터 문제를 처리/처리 할 수있다. –

0

showcase.projectsVARCHAR? 그럼 당신은 이런 REGEXP을 사용할 수

... 
INNER JOIN project ON 
showcase.projects REGEXP CONCAT('[[:<:]]', project.uid, '[[:>:]]') 
WHERE ... 
이 표현은 전체 단어를 검색

전용 (브라켓 구조는 왼쪽 표시하고 올바른 단어 경계는 각각 그러나, 나는이 사용을 할 수있을 것입니다 확실하지 않다. 인덱스를 사용하면 누군가가 더 똑똑해질 수 있습니다.

관련 문제