2014-10-11 60 views
0

并非所有的child行都有parent。该child行有一个parent只应获取如果parent.deleted='0'如果不存在LEFT JOIN,则忽略

如果LEFT JOIN content as parent不存在,我怎么忽略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条款中,但这只有在parent行存在的情况下才有效。

+0

那么你蚂蚁只选择parentid为null或parent.deleted <>'0'的那些行? – andy 2014-10-11 09:01:51

+0

是的,这是正确的 – user892134 2014-10-11 09:03:04

回答

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 JOIN将返回所有的行,即使parentid为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"); 

最后,作为一般规则,我留下了关于连接方向的声明,因此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");