在这里搜索了很多,我无法找到解决问题的方法。所以,我发布了这个问题。
我有一个数据库表,其结构如下:
folder_id folder_name parent_id
--------------------------------------
1 Private 0
2 Public 0
3 Photos 0
4 December 3
5 Bday 4
6 Celeb 5
在分层形式中,它将类似于文件夹结构:
-- Private
-- Public
-- Photos
----- December
-------- Bday
----------- Celeb
现在,我想选择一个特定文件夹的路径,例如 Bday 或 Celeb 文件夹。 因此,我想要一个MySQL查询,它只返回包含特定文件夹路径之间文件夹的行。
例如,如果我想要 Celeb 文件夹的路径,那么Query应仅返回这些行:
folder_id folder_name parent_id
--------------------------------------
3 Photos 0
4 December 3
5 Bday 4
6 Celeb 5
目前,我坚持使用此查询,但我无法使其正常工作。我正在尝试的查询:
SELECT f.*
FROM fd_folders f
LEFT JOIN fd_folders p
ON f.folder_id = p.parent_id
WHERE f.folder_id <=6
ORDER BY f.folder_id;
但问题是,它还会返回另外两个文件夹,即私有和公开。
请帮忙。
谢谢
最好的问候
答案 0 :(得分:1)
即使它没有直接回答你的问题,我也会发布这个。
看起来您可能需要将表设置为具有分层数据: http://www.sitepoint.com/hierarchical-data-database-2/
这需要一些游戏来正确设置,插入新数据将不是一个有趣的过程。如果您使用其他语言为您处理结果,您的生活可能会轻松得多。
如果您可以选择使用SQL Server(而不是mysql),那么这一切实际上变得非常简单。你只需要一个公用表表达式:
;WITH DirectoryTree (folderId, folderName, parentId)
AS
(
SELECT d.folderId, d.folderName, d.parentId
FROM zzz_Directories d
WHERE d.folderId = 4 -- target folderId
UNION ALL
SELECT d.folderId, d.folderName, d.parentId
FROM zzz_Directories d
INNER JOIN DirectoryTree dt ON dt.parentId = d.folderId
)
SELECT dt.folderId, dt.folderName, dt.parentId
FROM DirectoryTree dt
(分号故意)
遗憾的是,mysql不支持此功能。相反,您可能必须执行注释中建议的操作:使用存储过程。我没有测试环境,但我想这样的程序有两个部分:
UNION
程序该过程将简单地递归调用自己,直到父= 0.我不知道这是否可能,但它是一个开始的地方。