Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mysql中查看父级是否有子级?_Mysql_Sql_Search - Fatal编程技术网

如何在mysql中查看父级是否有子级?

如何在mysql中查看父级是否有子级?,mysql,sql,search,Mysql,Sql,Search,如何检查mysql表中的父项是否有子项?我只是在检查一个数据库,并使用递归来做这件事,因为所有数据都在同一个表中。但是它有很多数据,比如100k的寄存器。而且不是在mysql中做递归搜索就是在代码中做(Java),所以软件速度很慢 id | id_parent 1 null 2 1 3 2 4 null 5 3 现在我需要最后一个孩子 id

如何检查mysql表中的父项是否有子项?我只是在检查一个数据库,并使用递归来做这件事,因为所有数据都在同一个表中。但是它有很多数据,比如100k的寄存器。而且不是在mysql中做递归搜索就是在代码中做(Java),所以软件速度很慢

id  | id_parent         
1         null              
2         1           
3         2
4         null
5         3
现在我需要最后一个孩子

 id      | id_parent          
  5           3 
或者获取id是否有子项用于在代码中执行操作和执行多个查询

例如:

   if(i.id have child)
   {
    then do a search of the child
   }    
   else
   return the same valor
请帮忙。递归搜索是一个缓慢的过程。从表中只搜索2条记录需要10分钟。我不能更改数据库或表

----编辑2---- 感谢所有的答案,现在我找到了原始资料。A

  id      | id_orig          
  5           1 

感谢大家,我是通过代码来做这件事的。我的解决方案基于您的答案,假设该表名为people

要获取具有父项的所有id,可以执行以下操作:

SELECT id, id_parent FROM people WHERE id_parent NOT NULL
要接收父级具有
内部联接的数据
父级

SELECT c.id, c.id_parent, p.id, p.id_parent FROM people as c
INNER JOIN people as p ON (c.id_parent = p.id)
当需要更深入时,可以使用更多的
联接扩展上述查询。但是mySQL不是递归的,所以您必须始终指定您想要达到的深度

INNER JOIN people as p ON (c.id_parent = p.id)
INNER JOIN people as p2 ON (p.id_parent = p2.id)
当您总是想要结果时,无论子级是否有父级,请通过
左外联接更改
内部联接

扩展Pradeep的评论:也可以计算每个父母的子女数量

SELECT COUNT(*) FROM people GROUP BY id_parent

在查询末尾添加
HAVING COUNT(*)>0
仅显示有子项的父项

,假设该表名为people

要获取具有父项的所有id,可以执行以下操作:

SELECT id, id_parent FROM people WHERE id_parent NOT NULL
要接收父级具有
内部联接的数据
父级

SELECT c.id, c.id_parent, p.id, p.id_parent FROM people as c
INNER JOIN people as p ON (c.id_parent = p.id)
当需要更深入时,可以使用更多的
联接扩展上述查询。但是mySQL不是递归的,所以您必须始终指定您想要达到的深度

INNER JOIN people as p ON (c.id_parent = p.id)
INNER JOIN people as p2 ON (p.id_parent = p2.id)
当您总是想要结果时,无论子级是否有父级,请通过
左外联接更改
内部联接

扩展Pradeep的评论:也可以计算每个父母的子女数量

SELECT COUNT(*) FROM people GROUP BY id_parent

在查询末尾添加
HAVING COUNT(*)>0
仅显示有子项的父项

您只需要最后一个子项的列表吗?这很容易:

select child.id, child.id_parent
from people as child
left join people as no_child on no_child.id_parent = child.id
where no_child.id is null;
递归在SQL中通常很难实现,但是没有递归也可以完成一些事情

另一种选择:如果您确实只有几个100k条目,那么只需尝试在java中保持良好的数据结构与数据库同步即可。这种数据结构可以非常快速地搜索,而无需向数据库发出请求。当然,如果只有来自一台服务器的一个应用程序将写入该表,并且写入次数不太频繁,则这一点是有效的

另一种选择:在表中增加一列“last_child”,并在每次写请求时小心地更新该列。因为这不需要递归,所以您可以为此返回到普通SQL。这取决于您是否对子-父关系进行了大量数据更改,是否需要删除条目等等,但如果您想这样做,我们可以编写一些update语句


删除

您只需要最后一个孩子的列表?这很容易:

select child.id, child.id_parent
from people as child
left join people as no_child on no_child.id_parent = child.id
where no_child.id is null;
递归在SQL中通常很难实现,但是没有递归也可以完成一些事情

另一种选择:如果您确实只有几个100k条目,那么只需尝试在java中保持良好的数据结构与数据库同步即可。这种数据结构可以非常快速地搜索,而无需向数据库发出请求。当然,如果只有来自一台服务器的一个应用程序将写入该表,并且写入次数不太频繁,则这一点是有效的

另一种选择:在表中增加一列“last_child”,并在每次写请求时小心地更新该列。因为这不需要递归,所以您可以为此返回到普通SQL。这取决于您是否对子-父关系进行了大量数据更改,是否需要删除条目等等,但如果您想这样做,我们可以编写一些update语句


DELETE

要查找父对象是否有子对象,它更像是一个布尔输出,可以显示实际的子对象。因此,如果我们可以用group by进行计数,它会给你孩子的计数,零意味着不是孩子。选择p.id\u parent,按p.id\u parent将(*)计数为子项\u按c左外按p.id\u parent将人作为p加入(c.id\u parent=p.id)组;要确定父对象是否有子对象,它更像是一个布尔输出,可以显示实际的子对象。因此,如果我们可以用group by进行计数,它会给你孩子的计数,零意味着不是孩子。选择p.id\u parent,按p.id\u parent将(*)计数为子项\u按c左外按p.id\u parent将人作为p加入(c.id\u parent=p.id)组;