前段时间,我在this SQL query寻求帮助。它显示属于父类别的片段,使用类别ID将它们绑定在一起。我试图将其更改为显示所有类别,即使内部没有片段但我无法管理它。
我确信这不是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 :(得分:5)
将代码段条件移动到联接的on
子句中。
如果将其保留在where
子句中,则需要结果行与之匹配,但从代码段中丢失的行将包含null
个值,因此s.live=1
将为false
你将得不到匹配。
在on子句中,只需要来自代码段的行来匹配它,但是对于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
的示例中不必是真正的“join”谓词(即不必比较值表之间 - 它们可以只是对行本身的测试):
LEFT JOIN snippets AS s ON s.category = c.id AND s.live=1 AND s.company='$company'
请注意,某些数据库(例如mysql)允许您的原始语法仍能按预期工作。
已编辑也将s.company ='$ company'移入on子句。谢谢@Andriy
答案 1 :(得分:0)
使用RIGHT JOIN你会得到相同的结果吗?
答案 2 :(得分:0)
如果你想要完美匹配,你需要一个内部加入。如果您想要左侧的所有行以及右侧和左侧的所有行具有相同的ID,则需要左连接。