不按相关性排序的两个表上的MySQL匹配

不按相关性排序的两个表上的MySQL匹配,mysql,match,match-against,against,Mysql,Match,Match Against,Against,我有一个使用匹配的存储过程,它最初返回按相关性排序的数据,这正是我想要的。然而,当我添加了一个左连接和一个与匹配的第二个时,它现在从这两个连接返回数据,但不再按相关性排序。它现在自动按ID排序 从一个按相关性排序的表返回: BEGIN SELECT dictionary.id, dictionary.`term`, dictionary.`definition` FROM itDictionary dictionary WH

我有一个使用
匹配
的存储过程,它最初返回按相关性排序的数据,这正是我想要的。然而,当我添加了一个
左连接
和一个与
匹配的第二个
时,它现在从这两个连接返回数据,但不再按相关性排序。它现在自动按ID排序

从一个按相关性排序的表返回

BEGIN
    SELECT
        dictionary.id,
        dictionary.`term`,
        dictionary.`definition`
    FROM itDictionary dictionary
    WHERE MATCH(dictionary.term, dictionary.definition)
    AGAINST(_query IN NATURAL LANGUAGE MODE);
END
BEGIN
    SELECT
        dictionary.id,
        dictionary.`term`,
        dictionary.`definition`,
        links.id,
        links.`name`,
        links.`url`
    FROM itDictionary dictionary
        LEFT JOIN itRelatedLinks links ON links.term_id = dictionary.id
    WHERE MATCH(dictionary.term, dictionary.definition)
    AGAINST(_query IN NATURAL LANGUAGE MODE)
        OR MATCH(links.name)
    AGAINST(_query IN NATURAL LANGUAGE MODE);
END
从两个表返回,但以某种方式按ID排序

BEGIN
    SELECT
        dictionary.id,
        dictionary.`term`,
        dictionary.`definition`
    FROM itDictionary dictionary
    WHERE MATCH(dictionary.term, dictionary.definition)
    AGAINST(_query IN NATURAL LANGUAGE MODE);
END
BEGIN
    SELECT
        dictionary.id,
        dictionary.`term`,
        dictionary.`definition`,
        links.id,
        links.`name`,
        links.`url`
    FROM itDictionary dictionary
        LEFT JOIN itRelatedLinks links ON links.term_id = dictionary.id
    WHERE MATCH(dictionary.term, dictionary.definition)
    AGAINST(_query IN NATURAL LANGUAGE MODE)
        OR MATCH(links.name)
    AGAINST(_query IN NATURAL LANGUAGE MODE);
END

我接近了吗?

你可以这样做

SELECT
    dictionary.id,
    dictionary.`term`,
    dictionary.`definition`,
    links.id,
    links.`name`,
    links.`url`
FROM itDictionary dictionary
    LEFT JOIN itRelatedLinks links ON links.term_id = dictionary.id
WHERE MATCH(dictionary.term, dictionary.definition)
AGAINST(_query IN NATURAL LANGUAGE MODE)
    OR MATCH(links.name)
AGAINST(_query IN NATURAL LANGUAGE MODE)
ORDER BY MATCH(dictionary.term, dictionary.definition)
AGAINST(_query IN NATURAL LANGUAGE MODE)
    + MATCH(links.name)
AGAINST(_query IN NATURAL LANGUAGE MODE);
它将两者的分数相加,并有一个组合分数进行排序


当然,你可以在每个分数中添加一个因子来优先排序一个

Hey@nbk谢谢!我觉得这让我达到了目的。我只需要按降序进行最后一次排序,以使最大数量的搜索字符串位于列表的顶部。我不知道这是否可行,但假设我搜索两个词“帐户网络”。它目前正在对匹配“account”的所有行进行排序,并在对匹配“network”的所有行进行排序之前列出所有这些行,然后在最后添加链接匹配“account”或“network”的所有行。结果的顶部是ID42,在term和def之间有4次“account”,从那个里逐渐变小,然后移到“network”上