2010-12-17 2 views
0

예제 테이블 'main_table'에는 'ID', 'some_data'필드가 있습니다.MySQL 및 PHP : 정의되지 않은 수의 조인 된 테이블에서 필드를 통해 행 검색

'id', 'main_table_id', 'joinee_id'필드가있는 'agg'라는 집계 테이블이 있습니다.

그리고 마지막 테이블 'joinee'에 'id', 'email'필드가 있습니다.

테이블 'main_table'과 'joinee'는 'agg'를 통해 많은 : 많은 관계에 있습니다.

왼쪽 join을 한 후 'main_table'. 'id'로 그룹화하지 않고 'joinee'에서 'email'로 모든 'main_table'항목을 검색하고 싶습니다. 최종 결과는 모든 'main_table'항목을 항목별로 한 번씩 나열해야합니다. 이런 식으로 상상해보십시오. 'main_table'이 모든 '전자 메일'을 포함하는 임시 필드 "참가자"를 얻으 려합니다. 다음과 같은 쿼리에서이 필드에 LIKE 일치를 수행하여 찾을 수 있습니다 내가 입력 한 이메일과 관련이있는 'main_table'항목.

이것이 가능합니까?

이 메시지는 훨씬 더 큰 쿼리의 일부분입니다. 'main_table'은 이미 5 개의 다른 테이블과 조인되어 있으며 해당 필드는 이미 필터로 사용됩니다. 문제는 각각의 경우에 하나의 조인 된 테이블 만있을 수 있다는 것입니다. '조인'으로 연결된 항목의 수가 다릅니다.

감사합니다.

답변

1

행 결과를 단일 셀로 결합하는 것은 관계형 모델에서 지원하지 않는 것입니다. 대부분의 DBMS는 예외적으로 좋지 않습니다. 그 길을 간다면, 사용자 정의 함수 나 비표준 구문 기능을 사용하여 값을 결합하는 것과 같은 해킹을 상당량 끌어 내야합니다.

하지만 올바르게 이해한다면 문제는 관련 이메일 행에 원하는 항목이있는 메인 테이블의 항목을 찾아야하며 문제는 다 대다 관계라는 것입니다.

이 방법에 대해 :

  1. 당신이에 관심 inner join있는 email의 발견 쿼리를 작성 그 agg 테이블에. 이렇게하면 관련 main_table_id 개가 제공됩니다. 복식을 제거하려면 distinct 또는 group by을 사용하십시오.
  2. 1의 쿼리를 하위 쿼리로 사용하고 WHERE main_table.id IN (/* subquery */) 또는 1 단계의 하위 쿼리에 기존 쿼리 inner join 등을 사용하여 쿼리에 바로 연결할 수 있습니다. 어느 것을 사용하는지에 따라 다릅니다. 상황에. 전통적으로 하위 쿼리는 조인 (다른 모든 요소가 동일)보다 느리지 만 구조와 실제 데이터에 따라 다른 방법이 될 수 있습니다. 일부 오래된 DMBS에서는 임시 테이블에 하위 쿼리 결과를 버퍼링하면 유용 할 수 있습니다.
+0

이 응답을 보내 주셔서 감사 드리며,이를 테스트하고 결과를보고하겠습니다. – Swader

+0

쿼리를 완전히 다시 작성하는 동안 이것은 현재 쿼리를 처리하기위한 올바른 대답이었습니다. 고맙습니다! – Swader

관련 문제