2011-08-06 29 views
1

前一段时间,我要求帮助在this SQL query类别。它显示属于父类别的片段,并使用类别ID将它们绑定在一起。我尝试将其更改为显示所有类别,即使内部没有片段但我无法管理它。更改SQL查询来显示是空

我相信这不是一个PHP的事情,因为这个打印查询结果不显示空类别。

我只是需要帮助理解这一点,我需要改变,使其显示什么我需要它是什么。

这里的SQL:

SELECT c.id AS cid, c.slug AS cslug, c.name AS cname, s.id AS sid, s.name AS sname 
FROM categories AS c 
LEFT JOIN snippets AS s ON s.category = c.id 
WHERE c.live=1 AND s.live=1 AND c.company='$company' AND s.company='$company' 
ORDER BY c.name, s.name 

任何提示和链接,以良好的资源,了解SQL未免太感激。 :)

这里是什么时,通过PHP运行查询返回的例子。 SQL http://jsbin.com/obonal PHP Inefficient SQL Query

+0

您可以发布一个例子的结果? – Bytemain

+0

编辑我的OP与SQL和PHP的例子 – PaulAdamDavis

回答

5

将片段条件移入连接的on子句中。

如果你离开它的where子句中,结果行需要与之相匹配的,但是从片段缺失行将具有null值,所以s.live=1false,你会得到不匹配。

在条款上,从片段只行需要与之相匹配的,但与left,匹配是可选的,所以你还是从类别获得行时段不匹配:

SELECT c.id AS cid, c.slug AS cslug, c.name AS cname, s.id AS sid, s.name AS sname 
FROM categories AS c 
LEFT JOIN snippets AS s ON s.category = c.id AND s.live=1 AND s.company='$company' 
WHERE c.company='$company' 
AND c.live=1 
ORDER BY c.name, s.name 

的关键部分是join on条款,可以是任意复杂的,并且在s.live=1例子不必是真实的“加入”谓词(即没有表之间的比较值 - 他们可以只是该行本身测试) :

LEFT JOIN snippets AS s ON s.category = c.id AND s.live=1 AND s.company='$company' 

请注意,有些数据库,例如MySQL中,允许根据需要原来的语法仍然有效。

EDITED将s.company ='$ company'也移到了on子句中。由于@Andriy

+1

我同意与你是如何总结了问题的核心,但在查询的WHERE子句其实仍然包含右侧表的条件('s.company ='$ company'')。 –

+0

@Andriy哦 - 没有注意到。我也会这样做! – Bohemian

+0

谢谢,波西米亚和@Andriy。查询现在可以工作,我需要它,我知道如何!干杯。 – PaulAdamDavis

0

随着右连接你得到同样的结果?

0

如果你想要的完美搭配你需要一个内连接。如果你希望所有从左边行和所有从右边的行和左边具有相同ID,你需要一个左连接。