SQL联接-使用分组获取所有左侧行
因此,我有名为files和folders的表,它们之间有id和通常的关系:file.folder\u id=folder.id 此外,字段忽略可以忽略某些文件/文件夹 我正在尝试获取文件夹列表和相应文件夹中的文件计数。 我的第一种方法效果很好,但遗漏了空文件夹: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
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进行分组
)