在mysql中从同一个表中选择父子

时间:2013-07-03 12:18:28

标签: mysql sql database

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

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

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;

但问题是,它还会返回另外两个文件夹,即私有公开

请帮忙。

谢谢

最好的问候

1 个答案:

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

  1. 如果我的父母是0,请回复我
  2. 如果我的父母不是0,请返回UNION程序
  3. 该过程将简单地递归调用自己,直到父= 0.我不知道这是否可能,但它是一个开始的地方。