2014-10-08 2 views
0

모든 카테고리, 항목이없는 카테고리까지 표시해야합니다.왜 내 오른쪽 가입이 작동하지 않습니까?

이 쿼리가 있습니다. 반환

SELECT 
     i.id, 
     incident_active 'Approved', 
     incident_verified 'Verified', 
     category_title 'Category', 
     ParentCategory 'Parent Category' 
    FROM 
     incident i 
      INNER JOIN 
     incident_category ic ON i.id = ic.incident_id 
      RIGHT JOIN 
     incident_person ip ON i.id = ip.incident_id 
      RIGHT JOIN 
     (SELECT 
      c1.id, 
       c1.parent_id, 
       c2.category_title ParentCategory, 
       CONCAT_WS(' -> ', c2.category_title, c1.category_title) category_title 
     FROM 
      category c1 
     left outer join category c2 ON c1.parent_id = c2.id WHERE c1.parent_id != 0) AS c ON c.id = ic.category_id 
    WHERE incident_dateadd > DATE_SUB(NOW(), INTERVAL 1 MONTH) 

:

enter image description here

이 쿼리 반환

SELECT 
      c1.id, 
       c1.parent_id, 
       c2.category_title ParentCategory, 
       CONCAT_WS(' -> ', c2.category_title, c1.category_title) category_title 
     FROM 
      category c1 
     left outer join category c2 ON c1.parent_id = c2.id WHERE c1.parent_id != 0 

:

enter image description here

몇 번이나이 answer을 읽었지만 내 오른쪽 가입이 작동하지 않는 이유를 알 수 없습니다.

첫 번째 결과 집합은 8 개 개의 기둥이며, 부모 카테고리의 열이 있어야합니다 Protesta

UPDATE 내가 다음 쿼리 아 파크 일하고있어

: 아직도 내가 비록

SELECT * FROM (SELECT 
     i.id, 
     incident_title 'Título', 
     incident_description 'Descripción', 
     incident_date 'Fecha', 
     incident_active 'Aprobado', 
     incident_verified 'Veficado', 
     person_first 'Nombres', 
     person_last 'Apellidos', 
     person_email 'Email', 
     category_id 
     -- category_title 'Categoría', 
     -- ParentCategory 'Categoría Padre' 
    FROM 
     incident i 
      INNER JOIN 
     incident_category ic ON i.id = ic.incident_id 
      RIGHT JOIN 
     incident_person ip ON i.id = ip.incident_id 

    WHERE (incident_dateadd > DATE_SUB(NOW(), INTERVAL 1 MONTH) OR incident_dateadd IS NULL)) a 
RIGHT JOIN 

(SELECT 
      c1.id, 
       c1.parent_id, 
       c2.category_title ParentCategory, 
       CONCAT_WS(' -> ', c2.category_title, c1.category_title) category_title 
     FROM 
      category c1 
     left outer join category c2 ON c1.parent_id = c2.id WHERE c1.parent_id != 0) b ON a.category_id = b.id 

첫 번째 버전에서 작동하지 않는 이유를 이해하지 못한다. 두 가지 질문이 모두 같다.

사람이 차이를 설명 할 수 있다면

...

+4

'RIGHT JOIN'을 실행하는 경우에도 다른 테이블의 열 ('WHERE incident_dateadd> DATE_SUB (NOW(), INTERVAL 1 MONTH)')에 필터를 여전히 사용하고 있으므로 모든 'incident' 테이블에 존재하지 않는 행 – Lamak

+0

@Lamak 나는 '작동한다'는 버전을 만들었지 만, 첫 번째 버전이 작동하지 않는 이유는 분명히 알지 못합니다. 의견이 있으시면 고맙게 생각합니다. – Cesar

+1

댓글을 달았지만 분명히 자신을 설명하지 않은 것 같습니다. 그래서 단순화하기 위해'incident'와'category' 테이블 만 있다고 가정 해 봅시다. 인시던트 테이블에서'SELECT * FROM incident i RIGHT JOIN category ON '을 누른 다음 인시던트 테이블 **에서 WHERE i.col1> something'의 컬럼에 필터 **를 수행하면 정의에 따라 카테고리 사건이 없었기 때문에 (i.column이'NULL' 인 경우), 결과에서 걸러내어 첫 번째 장소에서'RIGHT JOIN'을 수행하는 이유를 효과적으로 취소합니다. (또한, 나는'RIGHT JOIN'을 싫어하고 항상 LEFT JOIN을 대신 사용한다.) – Lamak

답변

1

그것은 최종 where 조항의 위치.

첫 번째 쿼리에서는 모든 범주를 가져 와서 많은 수의 데이터와 연결하여 행을 컴파일합니다. 그런 다음 where 절을 사용하여 많은 행을 필터링하고 일부는 카테고리 행이됩니다.

간단한 예를 살펴 보겠습니다. 나는 다음과 같은 말한다면,이 테이블을 감안할 때

Table A:

X | Y 
----- 
1 | hi 
2 | bye 
3 | what 

Table B:

Z | X 
----- 
A | 1 
B | 1 
C | 2 

SELECT * FROM `B` RIGHT JOIN `A` ON A.X = B.X 

내 결과는 다음과 같습니다

Z | X | Y 
--------- 
A | 1 | hi 
B | 1 | hi 
C | 2 | bye 
- | 3 | what 

는 경우, 그러나, 나는 나의 질의는 테이블 A의 일부가 필터링되어

SELECT * FROM `B` RIGHT JOIN `A` ON A.X = B.X WHERE B.Z > 'A' 

하게 그 말에 where 절을 추가합니다.지금은이 :

Z | X | Y 
--------- 
B | 1 | hi 
C | 2 | bye 

그러나, 내 쿼리 전에 필터링을 수행하면과 같이 가입 :

SELECT * FROM 
    (SELECT * FROM `B` WHERE B.Z > 'A') AS B 
RIGHT JOIN `A` ON A.X = B.X 

내 테이블은 여전히 ​​A에서 모든 행이 포함되어 있습니다.

Z | X | Y 
--------- 
B | 1 | hi 
C | 2 | bye 
- | 3 | what 

이는 단지 문제입니다. 원래 쿼리에서 모든 행을 선택한 다음 일부를 제외합니다. 작동중인 쿼리에서 먼저 필터링 한 다음 필요한 모든 범주 행을 가져옵니다.

관련 문제