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而异。