不久前,我在这个SQL查询上寻求帮助.它显示属于父类别的片段,使用类别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
Run Code Online (Sandbox Code Playgroud)
任何有关学习SQL的良好资源的提示和链接也将受到赞赏.:)
以下是通过PHP运行时查询返回的示例.SQL http://jsbin.com/obonal PHP 低效的SQL查询
将代码段条件移动到连接的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
Run Code Online (Sandbox Code Playgroud)
关键部分是join on子句,它可以是任意复杂的,并且在示例中s.live=1不必是真正的"连接"谓词(即不必比较表之间的值 - 它们可以只是对行本身的测试) :
LEFT JOIN snippets AS s ON s.category = c.id AND s.live=1 AND s.company='$company'
Run Code Online (Sandbox Code Playgroud)
请注意,某些数据库(例如mysql)允许您的原始语法仍能按预期工作.
EDITED将s.company ='$ company'移入on子句中.谢谢@Andriy