我需要在单个表上构建查询。表结构和一些虚拟数据如下
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
上表中只有一个超级用户。这将成为用户hirarchy的顶级水平。此超级用户是唯一具有seniorid为-1的用户。超级用户是所有用户的父级。 在上表中,每个用户可能有也可能没有儿童用户。 表中提到了父用户和子用户之间的关系,使得seniorid中的数字只是其他用户的id。
例如:
考虑关注用户
id | username | seniorid
18 | user17 | 8
在上面的情况下,seniorid是8,因此上述用户的父母是
8 | user7 | 6
其中,作为“user7”6的高级,因此父级是
6 | user5 | 1
以这种方式做回溯我们将得到以下hirarchy列表,从“超级用户”到“用户17”
id | username | seniorid
1 | Superuser | -1
6 | user5 | 1
8 | user7 | 6
18 | user17 | 8
这个hirarchy将达到n级,即多达多级
我希望使用单一查询获得上面的hirarchy结果。
我需要你帮助构建上述查询。请允许任何人在mysql中给我这样的查询。
我有一个用户的id,username,seniorid,我需要在一个查询中查找高级用户列表。这里单个查询意味着它可能有多个嵌套查询。但整体而言,它将作为单一查询解雇。
答案 0 :(得分:0)
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);
?>
答案 1 :(得分:0)
如果您使用的是mysql,最好通过使用嵌套集来解决此问题。请尝试阅读此http://www.fliquidstudios.com/2008/12/23/nested-set-in-mysql/