Mysql SQL全文匹配值仅返回匹配项的布尔值(1或0)

Mysql SQL全文匹配值仅返回匹配项的布尔值(1或0),mysql,match,full-text-search,Mysql,Match,Full Text Search,我有以下SQL语句: SELECT g.*, ( MATCH (g.GameTitle) AGAINST ('call of duty') OR g.GameTitle SOUNDS LIKE 'call of duty' ) AS MatchValue, p.id AS platformid, p.alias AS PlatformAlias, p.name, p.i

我有以下SQL语句:

SELECT
    g.*,
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
    AS MatchValue,
    p.id AS platformid,
    p.alias AS PlatformAlias,
    p.name,
    p.icon
FROM
    games AS g,
    platforms AS p
WHERE
    (
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
        OR
        (
            MATCH (g.Alternates) AGAINST ('call of duty')
            OR g.Alternates SOUNDS LIKE 'call of duty'
        )
    )

AND g.Platform = p.id
ORDER BY MatchValue DESC
OR g.GameTitle SOUNDS LIKE 'call of duty'
它在与全文索引匹配时返回正确的结果集,但是报告的“MatchValue”仅具有布尔性质(0或1)

如果我删除语句的第5行:

SELECT
    g.*,
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
    AS MatchValue,
    p.id AS platformid,
    p.alias AS PlatformAlias,
    p.name,
    p.icon
FROM
    games AS g,
    platforms AS p
WHERE
    (
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
        OR
        (
            MATCH (g.Alternates) AGAINST ('call of duty')
            OR g.Alternates SOUNDS LIKE 'call of duty'
        )
    )

AND g.Platform = p.id
ORDER BY MatchValue DESC
OR g.GameTitle SOUNDS LIKE 'call of duty'
我得到了从5.23到15.56之间的合适匹配值,但是当匹配“备选”时,我失去了一些功能

我对SQL不是很在行,我花了好几天时间才让它发挥这么大的作用

有没有办法让第5行和第6行返回一个非布尔匹配值,以便我的结果正确排序


提前感谢;)

当你说
'ABC'或(3>2)
你是在要求一个
BOOL
结果。不能获取字符串或布尔值。在上述情况下,字符串
'abc'
转换为布尔值0,因为它不表示数字

由于在
中对字符串和布尔值进行赋值没有多大意义,因此我将两者分开:

SELECT
    g.*,
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
    AS MatchResultBoolean,
    MATCH (g.GameTitle) AGAINST ('call of duty') AS MatchText,
    p.id AS platformid,
    p.alias AS PlatformAlias,
    p.name,
    p.icon
FROM
    games AS g,
    platforms AS p
WHERE
    (
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
        OR
        (
            MATCH (g.Alternates) AGAINST ('call of duty')
            OR g.Alternates SOUNDS LIKE 'call of duty'
        )
    )

AND g.Platform = p.id
ORDER BY MatchValue DESC
请注意变化:

        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
    AS MatchResultBoolean,
    MATCH (g.GameTitle) AGAINST ('call of duty') AS MatchText,

通过这种方式,您可以双向获得:一次获得布尔值,在另一列中获得(可能的)匹配。

您希望如何确定
g.GameTitle的相关值。GameTitle听起来像是“使命召唤”
(或者本质上是
SOUNDEX(g.GameTitle)
)这与
MATCH
返回的相关性值有意义的关联,并且可以在它们之间进行排序?似乎我错误地假设SOUNDEX返回了相关性值,可能是我把它与其他东西混淆了。。。谢谢你的澄清:)谢谢你向我解释这一点,你这样做更有意义。我想如果我想在我的应用程序中包含这两种类型的匹配,并根据相关性对这个混合集进行排序,我可以从您提供的上述查询中获取结果,将它们全部粘贴到一个PHP数组(或等效数组)中,并根据初始搜索字符串对它们进行排序。。。当我们讨论这个主题时,我想您不知道有什么库/脚本或一些资源可以在php中完成这种类型的相关性排序?再次感谢你的帮助!;)Ii可能是一个过度扩张,但却是一个非常有能力的搜索引擎。不过,我想这会让你的事情变得相当复杂。