SQL联接-使用分组获取所有左侧行

SQL联接-使用分组获取所有左侧行,sql,join,relation,Sql,Join,Relation,因此,我有名为files和folders的表,它们之间有id和通常的关系:file.folder\u id=folder.id 此外,字段忽略可以忽略某些文件/文件夹 我正在尝试获取文件夹列表和相应文件夹中的文件计数。 我的第一种方法效果很好,但遗漏了空文件夹: SELECT folders.id, folders.name, count(files.id) kount FROM folders, files WHERE folders.site_id=111 AND files.ignore

因此,我有名为filesfolders的表,它们之间有id和通常的关系:file.folder\u id=folder.id

此外,字段忽略可以忽略某些文件/文件夹

我正在尝试获取文件夹列表和相应文件夹中的文件计数。 我的第一种方法效果很好,但遗漏了空文件夹:

SELECT folders.id, folders.name, count(files.id) kount
FROM folders, files

WHERE folders.site_id=111
AND files.ignored=0
AND folders.ignored=0 
AND files.site_id=111
AND files.folder_id=folders.id

GROUP BY folders.name 
ORDER BY folders.name
所以我寻找左连接

SELECT folders.id, folders.name, count(files.id) kount
FROM folders 


LEFT JOIN files 
ON files.folder_id=folders.id

WHERE folders.site_id=111
AND folders.ignored=0
AND files.ignored=0
AND files.site_id=111


GROUP BY folders.name 
ORDER BY folders.name

但同样-空文件夹丢失。我做错了什么?

您需要将筛选联接表的条件直接放入
左联接中

SELECT folders.id, folders.name, count(files.id) kount
FROM folders 
LEFT JOIN files ON files.folder_id=folders.id
               AND files.ignored=0
               AND files.site_id=111
WHERE folders.site_id=111
AND folders.ignored=0
GROUP BY folders.name 
ORDER BY folders.name
试试这个

SELECT folders.id, folders.name, count(files.id) kount
FROM folders 


LEFT JOIN files 
ON files.folder_id=folders.id
AND files.ignored=0
AND files.site_id=111

WHERE folders.site_id=111
AND folders.ignored=0



GROUP BY folders.name 
ORDER BY folders.name

WHERE子句中的
files.ignored=0
files.site_id=111
条件有效地将其转换为内部联接,因为WHERE子句中的条件必须满足才能返回行。正如@juergend在下面指出的,这些应该被移动到外部连接的ON子句中。因为您正在将WHERE子句中的
文件夹.site\u id
文件夹.ignored
的值限制为您需要的
文件中的值,您的ON可以是
ON files.folder\u id=folders.id和files.ignored=folders.ignored和files.site\u id=folders.site\u id
。祝你好运。你通常按你选择的列分组,除了那些作为设置函数参数的列。(即,
按folders.id、folders.name进行分组