我有一个像这样的MySQL表:
id | upperId | title
-------+-----------+---------
1 | 0 | World
2 | 1 | Europe
3 | 1 | Asia
4 | 2 | Germany
5 | 4 | Berlin
...
你明白了这个想法:
现在,我需要一个SQL查询来选择region
中特定级别的所有区域,比如第三个。在这个例子中,那将是德国,日本和中国。对于第二级,它将是欧洲和亚洲。
最好是查询对所有不同级别都是灵活的,而不是特定于一个级别。
是否有SQL方法可以执行此操作,还是需要使用PHP循环所有区域?
答案 0 :(得分:4)
对于特定级别(在本例中为第三级),您可以执行以下操作:
select l3.*
from region l1, region l2, region l3
where l1.upperId = 0
and l2.upperId = l1.id
and l3.upperId = l2.id
答案 1 :(得分:3)
我认为你应该做的最好的事情就是添加一个“深度”专栏。查询将更简单,更快速地执行。
答案 2 :(得分:1)
我认为您正在寻找通用解决方案。这里的要点是你正在做的是在树上进行的递归搜索,据我所知,MySQL没有递归操作。
因此,您必须在代码中自己使用递归(或等效迭代)。
根据项目中实现的内容,另一种解决方案可能是使用Nested Set而不是“普通”树。使用嵌套集数据结构,您的查询将引导您查找足够的.lft和.grt值。简单方便。
不幸的是,将表迁移到NestedSet结构并不简单。如果您的表已填充并正在生产中,我想在PHP中编写循环可能要快得多......
答案 3 :(得分:0)
也许是这样的? (未完全测试,但我认为它会起作用)
<?php
mysql_connect('localhost','root','yourpw');
mysql_select_db('db') or die (mysql_error());
$strSQL = "Select title FROM table";
$objQuery = mysql_query($strSQL) or die ("Error Query [".$strSQL."]");
$i = 0;
while($objResult = mysql_fetch_array($objQuery))
{
$i++;
$strSQL1 = "Select title FROM table Where upperId='".$i."'";
$objQuery1 = mysql_query($strSQL1) or die ("Error Query [".$strSQL1."]");
$objResult1 = mysql_fetch_array($objQuery1);
echo "<br>";
echo $objResult1["title"];
}
?>