我正在试图找出如何为我的媒体数据库制作搜索引擎。
虚拟文件夹的结构是:
表目录
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”中搜索名为“%media_1%”的媒体,包括其所有子文件夹,如何在不查询每个文件夹和子文件夹的情况下执行此操作?子文件夹的级别可能会有所不同。
答案 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_id
和descendant_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;及其子目录,无论多少级别