MySQL如何在虚拟文件夹中搜索媒体

时间:2015-05-21 15:43:55

标签: php mysql search directory subdirectory

我正在试图找出如何为我的媒体数据库制作搜索引擎。

虚拟文件夹的结构是:

表目录

id name parent

媒体的结构是:

表媒体

id name parent

我正在使用以下php函数列出我的所有目录

function print_menu($id = 0) {
    $sql = "SELECT directories.id AS id, directories.name AS name, directories.parent AS parent, directories.icon AS icon FROM directories 
    WHERE directories.parent = '".$id."' GROUP BY directories.id ORDER BY directories.name ASC";
    $req = $cnx->prepare($sql);
    $req->execute();
    if ($req->rowCount()>0) {
        echo "<ul>";
        while ($data=$req->fetch()) {
            echo "<li>".$data['name']."</li>";
            print_menu($data['id']);
        }
        echo "</ul>";
    }
 }

现在假设我有以下文件夹

    • 项目1
      • 目录1
        • subdir 1
        • subdir 2
        • subdir 3
      • 目录2
        • subdir 1
      • 目录3
        • subdir 1
        • subdir 2
    • 项目2
      • 目录1
        • subdir 1
        • subdir 2
      • 目录2
        • subdir 1
        • subdir 2
        • subdir 3
      • 目录3
        • subdir 1
    • 项目3
      • 目录1
        • subdir 1
      • 目录2
        • subdir 1
      • 目录3
        • subdir 1

我想在“项目1”中搜索名为“%media_1%”的媒体,包括其所有子文件夹,如何在不查询每个文件夹和子文件夹的情况下执行此操作?子文件夹的级别可能会有所不同。

2 个答案:

答案 0 :(得分:1)

通常,使用“树”表,要获取所有后代的列表,以及已知的最大深度,您可以构建如下查询:

SELECT layerN.ID
FROM theTable AS layer1
   INNER JOIN theTable AS layer2 
      ON layer1.id = layer2.parent_id 
      OR layer1.id = layer2.id
   INNER JOIN theTable AS layer3
      ON layer2.id = layer3.parent_id 
      OR layer2.id = layer3.id
   ...
   INNER JOIN theTable AS layerN
      ON `layerN-1`.id = layerN.parent_id 
      OR `layerN-1`.id = layerN.id
WHERE layer1.parent_id = [chosen_parent_node_id]
;

在ON条件中没有附加的“OR”子句,将不包括中间节点。 如果不需要中间节点并且“叶子”节点具有不同的深度,则INNER JOIN s将需要LEFT JOIN s,并且SELECT字段将更复杂一些:

SELECT IFNULL(layerN.id, IFNULL(`layerN-1`.id, IFNULL(....))) AS leafID

<强>替代地

您可以有一个额外的表来总结总祖先,最简单的版本会有两个字段ancestor_iddescendant_id(尽管您也可以包含“距离”)。最大的问题是它需要通过某种形式的代码来维护,树表上的触发器可能是最有效和最可靠的方法。

答案 1 :(得分:0)

好的,所以我找到了一个解决方案,我使用上面发布的函数来获取给定目录的所有子目录的ID,让我们说&#34;项目1&#34;有ID 42我将使用

$all_ids = array();
function print_menu($id = 0) {
    $sql = "SELECT directories.id AS id, directories.name AS name, directories.parent AS parent, directories.icon AS icon FROM directories 
    WHERE directories.parent = '".$id."' GROUP BY directories.id ORDER BY directories.name ASC";
    $req = $cnx->prepare($sql);
    $req->execute();
    if ($req->rowCount()>0) {
        while ($data=$req->fetch()) {
            $all_ids[] = $data['id'];
            print_menu($data['id']);
        }
    }
 }
all_ids[] = 42;
print_menu(42)

然后我只是做了一个像

这样的请求
SELECT * FROM medias WHERE medias.parent IN (".implode(',', $all_ids).") AND medias.name LIKE '%media_1%'

请求只会搜索&#34;项目1&#34;及其子目录,无论多少级别