我正在向现有应用添加搜索功能栏。现在,基于用户输入构建查询。它从平面表返回项目,并根据表中的parentID和ID字段在前端构建一个分层的对象数组。
目前,搜索工作如下。它返回与搜索输入匹配的项目。如果用户搜索马铃薯,
select foo.* from ... AND foo.name like "%$potato%" AND ...
我如何还返回ID匹配马铃薯parentID的项目,以便在搜索过程中保留前端的层次结构?
最终目标是让两个项目都与搜索本身匹配,并且返回包含与搜索匹配的子项的任何父项(但不包括其他不匹配的子项。)可能存在无限级别的层次结构,因此子项可以生孩子因此,我会假设需要一定程度的递归,但我不确定如何做到这一点。
值得注意的是,这是一个相当大的网络应用程序,而且我不能改变任何事情,所以我必须解决现有的查询格式。
答案 0 :(得分:0)
我相信你要找的是......所有匹配%potato%的记录加上其ID与所有%potato%的parentID匹配的所有记录。 您可以添加看起来像这样的 OR条件。
选择......来自... AND(foo.name喜欢"%potato%"或者foo.ID in(从foo中选择parentID,其中foo.name喜欢' %的马铃薯%&#39)...;
答案 1 :(得分:0)
假设您在parentId
表格中有foo
字段,该字段与同一表格中的另一个记录的id
字段相匹配,您可以自行加入返回父项的数据。我使用左连接,因为并非所有项目都有父项。
select *
from foo f1
left join foo f2 on f1.parentId=f2.id
where f1.name like ...
但是,从应用程序解析结果集中的字段名可能会出现问题。您必须从结果集中获取元数据,该元数据告诉您给定字段来自哪个表,或者您需要为父表中的每个字段提供特定的字段别名。
您可能还希望按f1.parentId
对结果集进行排序,以确保一个接一个地检索所有匹配的子记录。我会在应用程序级别上进行循环,因为MySQL无法真正返回树结构(除非你想在MySQL中组装一个json字符串)。