如何看看父母在mysql中是否有子女?

时间:2015-09-17 14:31:00

标签: mysql sql search

如何检查父级是否在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 ---- 感谢所有答案,现在我找到了de orig来源。甲

  id      | id_orig          
  5           1 

我通过代码执行此操作,感谢所有人。我的解决方案基于您的答案

2 个答案:

答案 0 :(得分:2)

您只需要最后一个孩子的名单?这很简单:

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。这取决于你是否有子父关系的海量数据更改,如果你需要删除条目等等,但如果你想这样做,我们可以编写一些更新语句。

DELETE

答案 1 :(得分:1)

假设该表名为人

要获得拥有父母的所有身份证,您可以执行以下操作:

SELECT id, id_parent FROM people WHERE id_parent NOT NULL

收到父母有INNER JOIN父母

的数据
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)

当需要更深入时,可以使用更多JOINS扩展上述查询。但mySQL不是递归的,所以你总是需要指定你想要的深度。

INNER JOIN people as p ON (c.id_parent = p.id)
INNER JOIN people as p2 ON (p.id_parent = p2.id)

当您始终想要孩子有父母的结果时,请按INNER JOIN

更改LEFT OUTER JOIN

延伸Pradeep的评论:也可以计算每个父母的子女数量。

SELECT COUNT(*) FROM people GROUP BY id_parent

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