0

我有一个这样的 MySQL 表:

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

你明白了:

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

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

如果查询对于所有不同的级别都是灵活的,而不是特定于一个级别,那将是更可取的。

有没有一种 SQL 方法可以做到这一点,或者我需要用 PHP 循环所有区域吗?

4

4 回答 4

4

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

select l3.*
from region l1, region l2, region l3
where l1.upperId = 0
and l2.upperId = l1.id
and l3.upperId = l2.id
于 2013-06-05T12:27:32.297 回答
3

我认为您应该做的最好的事情是添加一个“深度”列。查询将更简单、更快速地执行。

于 2013-06-05T12:43:12.890 回答
1

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

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

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

不幸的是,将表迁移到 NestedSet 结构并不简单。如果您的表已填充并在生产中,我想用 PHP 编写循环可能会快得多......

于 2013-06-05T12:36:45.300 回答
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"];
}

?>
于 2013-06-05T12:40:39.157 回答