0

我試圖修改從這個職位全路徑檢索代碼: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/在嵌套集模型中使用FULLTEXT而不是完全匹配。MySQL FULLTEXT返回唯一的最佳答案

以下是我想要的:我想從MATCH()AGAINST()中搜索出最佳匹配,並且使用'='符號僅查找這一個結果。

這是我已經試過:與AND node.content

DELIMITER // 
DROP PROCEDURE IF EXISTS find_node; 
// 

CREATE DEFINER = CURRENT_USER PROCEDURE find_node (
     IN searched TEXT 
) 

proc: BEGIN 

    SELECT DISTINCT parent.content 
    FROM tree AS node, 
      tree AS parent 
    WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.content = (SELECT content FROM tree WHERE MATCH(node.content) AGAINST(searched IN BOOLEAN MODE) LIMIT 1) 
    ORDER BY parent.lft; 

END // 
DELIMITER ; 

線beggining,但似乎它沒有運行程序後返回任何結果。 我希望能夠獲得第二,第三和n最佳匹配(也許使用LIMIT 1 OFFSET n,其中n是結果數?)。

感謝您的幫助

回答

0

這不合邏輯。再看看你的子查詢。

SELECT content 
    FROM tree /* << tree? */ 
WHERE MATCH(node.content) /* << node? */ ... 

您的表格是tree。在node對指定的列的匹配應用任何明智的選擇標準,以tree但要每排樹匹配,就像你說的在treeWHERE 1WHERE 1 = 1WHERE 2+2 != 5,或沒有行,正如WHERE 1 = 0。服務器返回所有行,LIMIT 1,,如果1行沒有提供正確的「內容」,那麼外部查詢不會返回行...或者子查詢不返回任何行,因爲WHERE是無法滿足的。目前還不清楚,如果沒有進一步分析,但是按照書面的說法,這個查詢似乎沒有達到你的目的。

我相信你打算這樣:

WHERE MATCH(tree.content) AGAINST ... 

我承認我不完全相信該方法的有效性,作爲解決什麼你真正想要實現,但是這似乎是一個合乎邏輯錯誤會解釋爲「沒有結果」。

您也可以在dba.SE上的MYSQL matching one column to another in a different table via a FULLTEXT index的答案中找到值,它是數據庫管理員的Stack Exchange站點。當然,通過「不同的表」,這個問題實際上是指一個連接,所以這個解決方案對於將一個表連接到它本身也是有用的。該解決方案使用存儲的功能來解除引用AGAINST()中不需要的列的限制,但它也處理LIMIT 1,以便獲得標量值。

但是......好像你想要多行,標量子查詢或存儲函數是不正確的。你需要一個派生表,其中MySQL稱爲subquery in the FROM clause。支持派生表中的LIMIT因服務器版本IIRC而異。