如何检查父级是否在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
我通过代码执行此操作,感谢所有人。我的解决方案基于您的答案
答案 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
仅显示包含子项的父项