Mysql 需要构造在同一个表中查找记录父项的查询吗?
我需要在单个表上构造一个查询。表结构和其中的一些虚拟数据如下Mysql 需要构造在同一个表中查找记录父项的查询吗?,mysql,sql,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 |
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
上表中只有一个超级用户。这将是在Hirarch的用户最高级别。此超级用户是唯一将seniorid设置为-1的用户。超级用户是所有用户的父用户。
在上表中,每个用户可能有也可能没有子用户。
表中提到了父用户和子用户之间的关系,所以seniorid中的数字只不过是另一个用户的id
例如:
考虑以下用户
id | username | seniorid
18 | user17 | 8
在上述情况下,seniorid为8,因此上述用户的家长为
8 | user7 | 6
其中,作为“user7”6的前辈ID,因此父级
6 | user5 | 1
通过这种方式进行回溯,我们将得到以下从“超级用户”到“用户17”的Hirachy列表
该雇佣制将具有高达n级的等级,即高达多个等级
我希望上面的Hirarch结果使用单个查询
我需要你的帮助来构造上面的查询。请任何人都能在mysql中给我这样的查询
我有一个用户的id、用户名、seniorid,我需要在一个查询中找到该用户的高级用户列表。这里,单个查询意味着其中可能有多个嵌套查询。但总的来说,它将作为一个查询启动。好吧,如果不知道要检索多少个级别,就不能在一个查询中执行此操作 如果需要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);
?>
如果使用mysql,最好使用嵌套集来解决此问题。试着阅读这篇文章这在MySQL中是不可能的,尽管如果您在查询中假设了一些最大的级别数,您可能可以绕过这个限制。@YegoshinMaxim谢谢您,先生!要回答在mysql或程序中在何处编写函数,请阅读一些关于在mysql中编写存储过程/函数的文章。然后您可以执行loop
循环,在seniorid
和seniorid=-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);
?>