有限的PHP/MySQL树

有限的PHP/MySQL树,php,mysql,tree,infinite,search-tree,Php,Mysql,Tree,Infinite,Search Tree,我有一个树算法和数据库的问题,我想有一个答案 我有几个区域,比如说20个。每个区域都有子区域,每个子区域约20个。 这些父区域分布在地图上这些父区域中的一些相互靠近。 数据库如下所示:[area\u id,title,parent\u id]-有些有多个子项,有一个包含所有区域的根节点。(邻接列表模型) 要在图片中制作此内容,我可以这样做: 正如我所说的,不同的区域可以彼此靠近(或远离)。我想用某种方式把1区和5区联系在一起,因为我知道它们很近,1区也靠近4区。现在,问题是,假设4区也靠近5区。

我有一个树算法和数据库的问题,我想有一个答案

我有几个区域,比如说20个。每个区域都有子区域,每个子区域约20个。 这些父区域分布在地图上这些父区域中的一些相互靠近。

数据库如下所示:[area\u id,title,parent\u id]-有些有多个子项,有一个包含所有区域的根节点。(邻接列表模型)

要在图片中制作此内容,我可以这样做:

正如我所说的,不同的区域可以彼此靠近(或远离)。我想用某种方式把1区和5区联系在一起,因为我知道它们很近,1区也靠近4区。现在,问题是,假设4区也靠近5区。

它看起来像这样:

SELECT adds.title, categories.title, area.title
FROM adds
INNER JOIN categories ON categories.category_id = adds.category_id
INNER JOIN areas ON adds.area_id = areas.area_id
WHERE areas.area_id IN (SELECT area_neighbors.area_neighbor_id 
                        FROM area_neighbors 
                        WHERE area_id='25')
OR adds.area_id='25'
这使它成为一个内环?因为我希望区域1靠近区域4,但区域4也靠近区域1。

我想做一个搜索,你可以选择“搜索附近的地区”,所以你选择一个地区,然后你可以搜索附近的地区。关于如何使用数据库和php解决这个问题,我可以使用一些技巧

我一直在这个论坛上四处寻找帮助,但我真的不知道这个问题的“名称”,如果有人能给我指出正确的方向或直接帮助我解决这个问题,我会很高兴


谢谢各位,如果您还需要知道其他一些事情,我会尽快回答。

对于任何涉及邻近性的问题,我肯定会采用一种方法输入地理空间信息(如果这些是真实的区域/区域)然后应用径向搜索,可以通过任意数量的简单到复杂的查询和计算来完成


如果这些地方是虚构的,那么考虑假的位置可能是有趣的——即使它是一个简单的X、Y坐标系。这将允许您再次执行径向搜索-您可以根据需要放大或缩小搜索-甚至可以简单地按从站点a到站点b的升序排列搜索结果。

要细分您需要的区域,可以沿轴拆分矩形。看看kd树、r树或四叉树和空间索引。我可以向您推荐我的php类Hilbert曲线。这是一条巨大的曲线,完全填满了飞机。你可以在phpclasses.org上找到它。

我最终用一种“相邻”选择语句解决了它

为此,我创建了另一个包含邻居关系的表。该表看起来像:[表id、区域id、邻居区域id]

在这里,我添加了所有可用的邻居,通过一些内部连接和选择状态,我成功地得到了我想要的,因此可以搜索与所选区域相邻的所有区域

sql语句如下所示:

SELECT adds.title, categories.title, area.title
FROM adds
INNER JOIN categories ON categories.category_id = adds.category_id
INNER JOIN areas ON adds.area_id = areas.area_id
WHERE areas.area_id IN (SELECT area_neighbors.area_neighbor_id 
                        FROM area_neighbors 
                        WHERE area_id='25')
OR adds.area_id='25'
这将给我所有在邻近地区添加到25区的数据


我不能说这是最聪明还是最好的解决方案,但这是一个适合我的解决方案。希望这对别人有帮助!谢谢你的回复

我不明白为什么你真的需要重复区域1->AERA 5,AERA 4。。。第一次知道这三个节点是绑定的就足够了。谢谢你的回答。那么问题是,在数据库中这样的东西会是什么样子?大约有20个区域以不同的方式连接在一起(彼此靠近),这将是一个非常大的表,只有20个区域,对吗?谢谢,我来看看!这基本上意味着你要建立一个X-Y坐标系并计算它们之间的距离?问题是,它们中的一些相互接触(相邻),这些是我想要找到的区域,特别是最近接触的区域,我将查看径向搜索,谢谢!是的,如果你用的是long/lat,你想用long/lat,否则这是一个简单的计算,这是我自己想出来的。我通过将作为“邻居”的id添加到区域id中来创建邻居列。