簡體   English   中英

SQL,如何獲取與搜索查詢匹配的項的父項

[英]SQL, how to get parent items of items that match a search query

我正在向現有應用程序添加搜索功能欄。 現在,將基於用戶輸入來構建查詢。 它從平面表返回項目,並根據表中的parentID和ID字段在前端構建對象的層次結構數組。

現在,搜索工作如下。 它返回與搜索輸入匹配的項目。 如果用戶搜索馬鈴薯,

select foo.* from ... AND foo.name like "%$potato%" AND ...

我還將如何返回ID與馬鈴薯的parentID相匹配的商品,以便在搜索過程中保留前端的層次結構?

最終目標是使與搜索本身匹配的項以及包含與搜索匹配的子項的所有父項都被返回(但排除不匹配的其他子項。)層次結構可能是無限的,因此子項可以有子級。 因此,我認為需要某種程度的遞歸,但是我不確定該怎么做。

值得注意的是,這是一個相當大的Web應用程序,並且我無法更改任何內容,因此我必須解決現有的查詢格式。

我相信您正在尋找的是...與%potato%匹配的所有記錄,以及ID與所有%potato%的parentID匹配的所有記錄。 您可以添加一個看起來像這樣的OR條件

從...中選擇... AND(foo.name如“%potato%”或foo.ID in(從foo中選擇parentID,其中foo.name如'%potato%')...;

假設您在foo表中具有parentId字段,並且與同一表中的另一個記錄的id字段匹配,則可以執行自聯接以返回父項的數據。 我使用左聯接,因為並非所有項都具有父項。

select *
from foo f1
left join foo f2 on f1.parentId=f2.id
where f1.name like ...

但是,您可能無法解析應用程序結果集中的字段名稱。 您必須從結果集中獲取元數據來告訴您給定字段來自哪個表,或者您需要為父表中的每個字段提供特定的字段別名。

您可能還希望按f1.parentId排序結果集,以確保所有匹配的子記錄都一個接一個地檢索。 我將在應用程序級別執行循環,因為MySQL無法真正返回樹結構(除非您想在MySQL中組裝一個json字符串)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM