2

在这里搜索了很多之后,我找不到解决我的问题的方法。所以,我发布这个问题。

我有一个数据库表,其结构如下:

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

现在,我想选择一个特定文件夹的路径,例如BdayCeleb文件夹。因此,我想要一个 MySQL 查询,它只返回包含特定文件夹路径之间的文件夹的行。

例如,如果我想要一个Celeb文件夹的路径,那么查询应该只返回这些行:

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;

但是,问题在于它还返回了另外两个文件夹,即PrivatePublic

请帮忙。

谢谢你

此致

4

1 回答 1

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 不支持这个。相反,您可能必须执行评论中建议的操作:使用存储过程。我没有一个环境来测试这个,但我想这样的过程将有两个部分:

  1. 如果我的父母是 0,请返回我
  2. 如果我的父母不是 0,UNION请将程序返回给我

该过程将简单地递归调用自身,直到父 = 0。我不知道这是否可能,但这是一个开始的地方。

于 2013-07-03T14:02:58.500 回答