2014-10-11 2 views
0

모두가 child 행에 parent이 아닙니다. parent을 가지고있는 child 행은 LEFT JOIN content as parent 만약 parent.deleted='0'LEFT JOIN이 존재하지 않으면 무시하십시오.

이 존재하지 않는 경우, 어떻게 해당 행에 대한 parent.deleted='0' 무시합니까 꺼낼 필요가?

SELECT child.* FROM `content` child LEFT JOIN 
content parent on parent.id=child.parentid AND child.submittype='2' WHERE child.username=? 
AND child.deleted='0' AND parent.deleted='0' 
ORDER BY child.id DESC LIMIT 12 

어떻게하면됩니까? 나는 parent.deleted='0'을 WHERE CLAUSE에 넣었지만 parent 행이있는 경우에만 작동합니다.

+0

그래서 parentid가 null이거나 parent.deleted <> '0'인 행만 선택하면됩니까? – andy

+0

네 맞습니다. – user892134

답변

1

당신이 찾고있는 SQL은

SELECT child.* 
FROM `content` child 
    LEFT JOIN 
     content parent 
on parent.id=child.parentid AND child.submittype='2' 
WHERE child.username=? 
AND child.deleted='0' AND (parent.deleted='0' OR parent.deleted IS NULL) 
ORDER BY child.id DESC LIMIT 12 
0

LEFT JOINparentid가 NULL 경우에도 모든 행을 반환 할 것이다. 따라서 문제를 해결하기위한 첫 번째 단계는 대신 INNER JOIN을 사용하는 것입니다. 자세한 내용은 this question을 참조하십시오.

이제 결과 세트에는 부모가 실제로 사용 가능한 행만 포함됩니다. 이 결과를 더 자세히 필터링하려면 WHERE 절이 이미 있어야합니다. 그러나 더 나은 가독성을 위해 필자는 submittype에 필터를 옮길 것을 제안합니다. 전체적인 결과는 다음과 같습니다

SELECT child.* FROM `content` child INNER JOIN 
    content parent on parent.id=child.parentid 
WHERE 
    child.username=? AND 
    child.submittype='2'AND 
    child.deleted='0' AND 
    parent.deleted='0' 
ORDER BY child.id DESC LIMIT 12 
2

난 당신이 이런 식으로 뭔가를 찾고 생각 :

또한
$getitem = $connectdb->prepare("SELECT child.* FROM `content` child LEFT JOIN 
content parent ON parent.id=child.parentid AND child.submittype='2' WHERE child.username=? 
AND child.deleted='0' AND (parent.deleted='0' OR parent.deleted IS NULL) 
ORDER BY child.id DESC LIMIT 12"); 

왼쪽 단지 목표 테이블이 마음에 가입 말할 수 조인

$getitem = $connectdb->prepare("SELECT child.* FROM `content` child LEFT JOIN 
parent ON parent.id=child.parentid AND child.submittype='2' WHERE child.username=? 
AND child.deleted='0' AND (parent.deleted='0' OR parent.deleted IS NULL) 
ORDER BY child.id DESC LIMIT 12"); 

마지막으로 일반적으로 조인 방향에 대한 on 문을 남겨 두었으므로 child.submittype도 WHERE 절로 이동할 수 있습니다.

$getitem = $connectdb->prepare("SELECT child.* FROM `content` child LEFT JOIN 
parent ON parent.id=child.parentid WHERE child.submittype='2' AND child.username=? 
AND child.deleted='0' AND (parent.deleted='0' OR parent.deleted IS NULL) 
ORDER BY child.id DESC LIMIT 12"); 
관련 문제