繁体   English   中英

从MySQL中的同一表中选择父子

[英]selecting parent child from same table in mysql

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

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

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

请帮忙。

谢谢

最好的祝福

即使它没有直接回答您的问题,我也将发布它。

看来您可能需要将表设置为具有分层数据: 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程序

该过程将简单地递归调用自身,直到parent =0。我什至不知道这是否有可能,但这是一个起点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM