使用SQL选择特定级别的行

时间:2013-06-05 12:21:43

标签: php mysql sql database

我有一个像这样的MySQL表:

id     | upperId   | title
-------+-----------+---------
1      | 0         | World
2      | 1         | Europe
3      | 1         | Asia
4      | 2         | Germany
5      | 4         | Berlin
...

你明白了这个想法:

  • 世界
    • 欧洲
      • 德国
        • 柏林
      • 中国
        • 北京
      • 日本

现在,我需要一个SQL查询来选择region中特定级别的所有区域,比如第三个。在这个例子中,那将是德国,日本和中国。对于第二级,它将是欧洲和亚洲。

最好是查询对所有不同级别都是灵活的,而不是特定于一个级别。

是否有SQL方法可以执行此操作,还是需要使用PHP循环所有区域?

4 个答案:

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

?>