需要构建查询哪个会在同一个表中查找记录的父项?

时间:2012-10-03 11:54:49

标签: mysql sql

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

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,我需要在一个查询中查找高级用户列表。这里单个查询意味着它可能有多个嵌套查询。但整体而言,它将作为单一查询解雇。

2 个答案:

答案 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/