如果LEFT JOIN不存在则忽略

时间:2014-10-11 08:57:08

标签: mysql

并非所有child行都有parent。只有child

才能获取parentparent.deleted='0'

如果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 CLAUSE中,但这仅在parent行存在时才有效。

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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

答案 2 :(得分:0)

即使LEFT JOIN为NULL,parentid也会返回所有行。因此,解决问题的第一步是使用INNER JOIN。有关说明,请参阅this question

您的结果集现在只包含父实际可用的行。要进一步过滤此结果,您的WHERE子句已存在。但是,为了更好的可读性,我建议在那里移动提交类型的过滤器。总体结果将是:

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