【问题标题】:Concatenating arbitrary number of rows of strings in mysql (hierarchical query)在mysql中连接任意数量的字符串行(分层查询)
【发布时间】:2010-09-16 03:01:17
【问题描述】:

我有一个带有专辑的 mysql 表。每个专辑可以是顶级专辑,也可以是另一个专辑的子专辑。每个相册都有一个文件夹名称,它是其图片所在文件夹的名称。每个相册还有一个名为 parent 的字段,它是父相册的 id。所以,如果我有这样的图像路径:

root/album1/album2/image1.jpg

那么数据库中的专辑表将如下所示:

id parent foldername
1  NULL   root
2  1      album1
3  2      album2

那么问题来了,如何只用mysql从这个表中获取之前打印的路径?

【问题讨论】:

    标签: mysql string tree directory concat


    【解决方案1】:

    DB2、SQL Server、PostgreSQL 和 Oracle 都支持公用表表达式 (CTE),可用于完成此操作。 Oracle 也有“CONNECT BY”关键字。

    我知道这并不能解决您的问题,但也许它会帮助其他人在 MySQL 以外的问题上寻找解决方案。

    在您的情况下,出于性能考虑,我建议将完整路径存储在一个列中 - 插入/更新时对非规范化数据的管理可能会在读取性能方面获得很多倍的回报。

    【讨论】:

      【解决方案2】:

      我不确定在数据库中存储树是个好主意...

      为了让您的问题简单,也许只需将专辑的完整路径存储在表格的列中...

      id parent path           foldername
      1  NULL   /              root
      2  1      /root/         album1
      3  2      /root/album1/  album2
      

      【讨论】:

      • 在这种情况下,规范化数据库导致的问题多于解决的问题。这是一个很好的解决方案,可以节省大量工作。
      【解决方案3】:

      完全未经测试,并在我的脑海中输入...

      DECLARE @FOLDER VARCHAR(200)
      DECLARE @TOPID AS INT
      DECLARE @MYID As int
      
      CREATE TABLE #tmp
      (
          [id] INT,
          [path] VARCHAR(50)
      )
      
      DECLARE tempCursor CURSOR FOR SELECT id FROM albums ORDER BY id
      OPEN tempCursor
      
      FETCH NEXT FROM tempCursor INTO @TOPID
      
      WHILE @@FETCH_STATUS = 0
      BEGIN
          SET @FOLDER = ''
          SET @MYID = @TOPID
      
          WHILE @MYID is not null
          BEGIN
              SELECT @MYFOLDER = foldername FROM albums WHERE id = @MYID
              SET @FOLDER = @MYFOLDER + '/' + @FOLDER
              SELECT @MYID = parent FROM albums WHERE id = @MYID
          END
      
          INSERT INTO #tmp
          SELECT @TOPID, @FOLDER
      
          FETCH NEXT FROM tempCursor INTO @TOPID
      END
      CLOSE tempCursor
      DEALLOCATE tempCursor
      
      SELECT * FROM #tmp
      DROP TABLE #tmp
      

      这至少应该让您了解如何获取路径名。您从未指定文件名的存储位置。

      顺便说一句,这会很慢。我讨厌使用光标...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        • 2013-10-01
        • 2023-03-30
        • 1970-01-01
        • 2018-10-16
        • 2018-10-23
        • 1970-01-01
        相关资源
        最近更新 更多