并非所有child
行都有parent
。只有child
parent
行parent.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
行存在时才有效。
答案 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