2012-07-10 3 views
5

project 하나가 복수 categories에 속할 수있는 모듈을 구현하는 데 문제가 있습니다. 예 : 프로젝트 "PHP Programmer"는 Programming, PHP 카테고리에 속합니다. 다음 쿼리 (카테고리 1,3,11에 속하는 선택 프로젝트) 가정MySQL LEFT JOIN 중복 결과

: 2 경기에서가 있기 때문에

SELECT projects.* FROM projects 
    LEFT JOIN pojects_category on projects.id = pojects_category.project_id 
    WHERE pojects_category.category_id IN (1,3,11) and projects.id='94'` 

을 나는 a를 같은 프로젝트를 두 번 반환받을 project_id에 대한 project_category 테이블 = 94

projects_category 스키마

,536,
CREATE TABLE IF NOT EXISTS `pojects_category` (
    `project_id` int(10) NOT NULL, 
    `category_id` int(10) NOT NULL, 
    KEY `category_id` (`category_id`), 
    KEY `project_id` (`project_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 


INSERT INTO `pojects_category` (`project_id`, `category_id`) VALUES 
(94, 3), 
(94, 1); 

내가 누락 된 것이 있습니까?

솔루션 : GROUP BY 또는 DISTINCT

+1

각 프로젝트 중 하나만 원하면 쿼리에 GROUP BY project_id를 추가하십시오. – mariusnn

+0

@mariusnn 감사합니다. 작동합니다! – technology

+0

그룹을 사용하지 마십시오. 내 설명을 참조하십시오. – Sebas

답변

8

없음을 사용하여,이 괜찮습니다. 중복을 제거하기 위해 DISTINCT 키워드를 사용하려는 드문 경우 중 하나 일뿐입니다.

이 경우 두 개 이상의 행을 반환하더라도 쿼리의 논리가 정확하다는 사실에 의해 정당화됩니다. 실제로 쿼리의 논리가 잘못되었을 때 DISTINCT의 사용법을 여러 번 볼 수 있습니다.

사이드 노트 :

  • 당신이 IS NULL/IS NOT NULL 이외의 WHERE 절에서 사용하는 테이블 참조에 어떤 필터가 최종 결과 집합에 대한 등의 INNER JOIN이 동일한 테이블 참조 차례에 어떤 LEFT JOIN을 만들 것 행동.
  • 당신은이 이유를 위해, DISTINCT의 효과를 시뮬레이션 할 수 GROUP BY를 사용하지 에게서는 : (https://stackoverflow.com/a/15483895/1291428이 참조)

    1/이건 그냥 목적이 아니다. GROUP BY의 효과 중 하나는 중복을 제거하는 것이지만 주된 목적은 특정 분석 계산/연산을 적용하기 위해 특정 조건 집합에 따라 행을 그룹화하는 것입니다.

    2/GROUP BYORDER BY 결과가 (mysql에서) 필요하지 않으며 필요한 경우 실행이 느려집니다. 엔진이 제공하는 것을 적절히 사용하도록하십시오. 이는 항상 순방향 호환성의 관점에서 볼 때 더 좋습니다. (당신이 당연한 것으로 포함시키는 것이 실제로는 아니라는 것을 예상 함)

+0

글쎄, 그걸 알지 못했습니다. 나는 힘든 그룹을 DISTINCT와 동의어로 사용했습니다. 고마워, 지금 나는 별개의 것을 사용하고있다. 그리고 그것은 크게 작동한다. :) – technology

+0

DISTINCT와 GROUP BY에 관한 명확한 점을 만들기위한 탱크 – mariusnn

0

또한 중복 해결하기 위해 "IN"으로 이것을 다시 작성할 수 있습니다 :

SELECT projects.* 
FROM projects  
where projects.id in (select project_id 
         from projects_category 
         WHERE pojects_category.category_id IN (1,3,11) 
        ) and 
     projects.id='94' 

은 "에서"필터링 기록을 위해 조인 사용하는 경우 형성되는 중복을 방지 할 수 있습니다.