Php 使用SQL选择特定级别上的行

Php 使用SQL选择特定级别上的行,php,mysql,sql,database,Php,Mysql,Sql,Database,我有一个MySQL表,如下所示: id | upperId | title -------+-----------+--------- 1 | 0 | World 2 | 1 | Europe 3 | 1 | Asia 4 | 2 | Germany 5 | 4 | Berlin ... 你明白了: 世界 欧洲 德国 柏林 亚洲 中国 北京 日本 现在,

我有一个MySQL表,如下所示:

id     | upperId   | title
-------+-----------+---------
1      | 0         | World
2      | 1         | Europe
3      | 1         | Asia
4      | 2         | Germany
5      | 4         | Berlin
...
你明白了:

世界 欧洲 德国 柏林 亚洲 中国 北京 日本 现在,我需要一个SQL查询来从区域中选择特定级别上的所有区域,比如第三个。在这个例子中,这将是德国、日本和中国。第二个层次是欧洲和亚洲

如果查询对于所有不同的级别都是灵活的,而不是特定于一个级别,则更好


是否有一种SQL方法可以做到这一点,或者我需要使用PHP或其他语言循环所有区域?

对于特定级别,在本例中,第三个级别可以执行以下操作:

select l3.*
from region l1, region l2, region l3
where l1.upperId = 0
and l2.upperId = l1.id
and l3.upperId = l2.id

我假设您正在寻找通用解决方案。这里的要点是,您所做的是隐式地在树上进行递归搜索,据我所知,MySQL没有递归操作

因此,您必须自己在代码中使用递归或等效迭代

根据在项目中实现的内容,另一种解决方案可能是使用“普通”树而不是“普通”树。使用嵌套的集合数据结构,查询将引导您寻找适当的.lft和.grt值。简单方便


不幸的是,将表迁移到嵌套集结构并不简单。如果您的表已填充并处于生产状态,我想用PHP编写循环可能会快得多…

可能是这样的吗?没有完全测试,但我认为它会工作

<?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"];
}

?>

我认为最好的办法是添加一个深度列。查询将更简单,执行速度更快。

能否显示您的查询?导出查询结果。。。please@NullVoid对不起,你什么意思?我不知道怎么做,所以我想看看如何为它构建一个查询。一个简单的从tb1中选择title,upperId=2不是很有效吗?啊,我看到了混乱。我需要该级别上的所有行。我更新了示例。所以,不仅是欧洲下面的争吵,还有亚洲下面的争吵。谢谢!你会因为一些通用的东西而得到加分,例如,不特定于第三级