【问题标题】:Further Improve MySql Query Results Ordering进一步完善MySql查询结果排序
【发布时间】:2012-03-08 13:15:09
【问题描述】:

我有一个主要在全文索引字段上操作的查询。

查询如下:

SELECT
    MATCH (g.GameTitle) AGAINST ('quake ii') as Score,
    g.*, p.id AS platformid,
    p.alias AS PlatformAlias,
    p. name,
    p.icon
FROM
    games as g,
    platforms as p
WHERE
    MATCH (g.GameTitle) AGAINST ('quake ii')
    AND g.Platform = p.id;

我希望 mysql 将所有最接近搜索字符串“quake ii”的结果返回到顶部,但事实并非如此......事实上,数据库中有两个条目的游戏标题为“quake ii",即使它们具有相同的分数,它们也会在分数排序的两端分开。

这可以在此处的结果中看到:

Score               id      GameTitle
-----               --      ---------
5.883631706237793   393     Quake II
5.883631706237793   777     Quake
5.883631706237793   778     Quake 4
5.883631706237793   2922    Quake
5.883631706237793   2924    Quake II
5.817491054534912   427     Quake III Arena
5.817491054534912   2925    Quake III Arena
5.689572811126709   85      Enemy Territory: Quake Wars

我怎样才能让两个“quake ii”条目的预期结果出现在结果的顶部??

【问题讨论】:

    标签: mysql sql-order-by


    【解决方案1】:

    发件人:

    http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

    要索引的单词的最小和最大长度由 ft_min_word_len 和 ft_max_word_len 系统变量定义。 .... 默认最小值为四个字符;

    因此,“ii”实际上在搜索中完全被忽略了。

    该页面还详细说明了如何更改最小值

    【讨论】:

      【解决方案2】:

      您总是可以通过...添加订单

      ORDER BY
         case when  left( g.GameTitle, 8 ) = "Quake II" and length( trim( g.GameTitle )) = 8
            then 1 else 2 end
      

      这会将相同的 Quake II(也以相同的长度)刷新到顶部,以及它下面的所有其他...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多