0

我需要在单个表上构造一个查询。表结构和其中的一些虚拟数据如下

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

上表中只有一个超级用户。这将是用户层次结构的最高级别。此超级用户是唯一一个将高级 ID 设为 -1 的用户。超级用户是所有用户的父级。在上表中,每个用户可能有也可能没有子用户。表中提到了父用户和子用户之间的关系,因此seniorid中的数字只是另一个用户的id。

例如:

考虑关注用户

id  | username  | seniorid
18  | user17    |    8

在上述情况下,seniorid 为 8,因此上述用户的父级为

8   | user7 |    6

其中作为“user7”6的seniorid,因此父级是

6   | user5 |    1

通过这种方式进行回溯,我们将获得从“超级用户”到“用户17”的以下层次结构列表

id  | username  | seniorid
1   | Superuser |   -1
6   | user5 |    1
8   | user7 |    6
18  | user17    |    8

这个层次结构将有多达 n 个级别,即多达许多级别

我想要使​​用单个查询的层次结构结果。

在构建上述查询时,我需要您的帮助。请任何人都可以在mysql中给我这样的查询。

我有我需要在单个查询中找出其高级用户列表的用户的 id、用户名、高级用户 ID。这里的单个查询意味着它可能有多个嵌套查询。但作为一个整体,它将作为单个查询触发。

4

2 回答 2

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);
?>
于 2012-10-03T12:03:29.350 回答
0

如果您使用的是 mysql,最好使用嵌套集来解决这个问题。尝试阅读此http://www.fliquidstudios.com/2008/12/23/nested-set-in-mysql/

于 2012-10-03T12:21:35.297 回答