我需要在一个表上构造一个查询。表结构和其中的一些虚拟数据,如下所示
id | username | seniorid
1 | Superuser | -1
2 | user1 | 1
3 | user2 | 1
4 | user3 | 3
5 | user4 | 4
6 | user5 | 1
7 | user6 | 6
8 | user7 | 6
9 | user8 | 8
10 | user9 | 9
11 | user10 | 8
12 | user11 | 8
13 | user12 | 8
14 | user13 | 6
15 | user14 | 3
16 | user15 | 2
17 | user16 | 8
18 | user17 | 8在上表中,只有一个超级用户。这将在用户的层次结构中处于顶层。此超级用户是惟一具有-1的seniorid的用户。超级用户是所有用户的父级。在上表中,每个用户可能有也可能没有子用户。表中提到了父用户和子用户之间的关系,使得高级用户中的数字只是另一个用户的id。
例如:
考虑以下用户
id | username | seniorid
18 | user17 | 8在上面情况下,seniorid是8,因此上面用户的父级是
8 | user7 | 6其中,作为"user7“6的高级对象,因此父对象是
6 | user5 | 1通过这种方式回溯,我们将得到以下从“超级用户”到"user17“的层次结构列表。
id | username | seniorid
1 | Superuser | -1
6 | user5 | 1
8 | user7 | 6
18 | user17 | 8此层次结构将具有最多n个级别,即多个级别
我想上面的层次结构的结果使用单一查询。
我需要你的帮助来构建上面的查询。请任何人可以给我这样的查询在mysql。
我有id,username,seniorid的用户,我需要在一个查询中找到他的高级用户列表。在这里,单个查询意味着它可能包含多个嵌套查询。但作为一个整体,它将作为单个查询触发。
发布于 2012-10-03 20:03:29
AFAIK,如果您不知道要检索多少个级别,则不能在单个查询中执行此操作。
如果您需要n级别,则查询将如下所示:
SELECT * FROM users u
LEFT JOIN users u1 on u1.id = u.seniorid
LEFT JOIN users u2 on u2.id = u1.seniorid
...
LEFT JOIN users u{n-1} on u{n-1}.id = u{n-2}.seniorid
WHERE u.id = 1您可以定义最大层级数并生成这样的查询。
如果你不能做到这一点,你将不得不链接和级别一样多的查询……
编辑:如下所示:
<?php
function addSeniors($id,&$array){
$s = "SELECT * FROM users WHERE id = $id";
$q = mysql_query($q);
$results = array();
while($r = mysql_fetch_assoc($q)){
$array[]=$r;
addSeniors($r('seniorid'),$array);
}
}
$s = "SELECT * FROM users WHERE id = 1";
$q = mysql_query($s);
$results = array(mysql_fetch_assoc($q));
addSeniors($r['seniorid'],$results);
?>发布于 2012-10-03 20:21:35
如果您使用的是mysql,那么最好使用嵌套集合来解决这个问题。尝试读取此http://www.fliquidstudios.com/2008/12/23/nested-set-in-mysql/
https://stackoverflow.com/questions/12707955
复制相似问题