2014-10-11 66 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");