0

我正在尝试从这篇文章中修改用于全路径检索的代码:http: //mikehillyer.com/articles/managing-hierarchical-data-in-mysql/在嵌套集模型中使用 FULLTEXT 而不是完全匹配。

这就是我想要的:我想获得从 MATCH() AGAINST() 搜索的最佳匹配,而不是使用 '=' 符号只找到这一个结果。

这是我尝试过的:

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 ;

以 AND node.content 开头的行,但运行该过程后似乎没有返回任何结果。我也希望能够获得第二、第三和 n 最佳匹配(也许使用 LIMIT 1 OFFSET n,其中 n 是结果编号?)。

谢谢你的帮助

4

1 回答 1

0

这在逻辑上是不明智的。再次查看您的子查询。

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

你的桌子在这里tree。对 in 中的列指定匹配项不会对树中的每一行node应用任何明智的选择标准,tree但会匹配树中的每一行,就像您说WHERE 1orWHERE 1 = 1WHERE 2+2 != 5,或 中没有行tree一样WHERE 1 = 0。服务器返回所有行,LIMIT 1,如果该 1 行没有提供正确的“内容”,则外部查询不返回任何行……或者子查询不返回任何行,因为WHERE无法满足。目前尚不清楚,没有进一步分析,但正如所写的那样,查询似乎没有按照您的意图进行。

我相信你的本意是:

 WHERE MATCH(tree.content) AGAINST ...

我承认我并不完全相信这种方法的有效性,作为你真正想要完成的事情的解决方案,但这似乎是一个逻辑错误,可以解释“没有结果”。

您还可以通过dba.SE(数据库管理员的 Stack Exchange 站点)上的 FULLTEXT 索引对不同表中的一列与另一列进行匹配的 MYSQL的回答中找到价值。当然,通过“不同的表”,问题实际上是指连接,因此该解决方案对于将表连接到自身也很有用。该解决方案使用存储函数来解除对引用 in 中的列的限制AGAINST(),这是您不需要的,但它也处理 ,LIMIT 1以便您获得标量值。

但是......如果您想要多行,标量子查询或存储函数似乎也不正确。您需要一个派生表,MySQL在该子句中调用一个子查询FROM。对派生表的支持LIMIT因服务器版本 IIRC 而异。

于 2017-01-30T01:31:37.920 回答