我得到了以下查询,它可以很好地工作:

if err := rs.db.
        Preload("Artist").
        Preload("Genre").
        Where("MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`) AGAINST (? IN BOOLEAN MODE)", text).
        Find(&rs.Records).
        Error; err != nil {
        utils.Logger.Error("error while preloading artists and genres for record", zap.Error(err))
        return errors.New(err.Error())
    }

正如预期的那样,它的人口为&rs.Records人.

但是我需要我的查询更灵活,所以我try 向它添加一些通配符,因此原始查询应该如下所示:

SELECT * FROM records WHERE MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`)
AGAINST ('* TEXT YOU WANT TO SEARCH *' IN BOOLEAN MODE)

注意*的用法.翻译成我的GORM查询的代码应该是这样的:

if err := rs.db.
        Preload("Artist").
        Preload("Genre").
        Where("MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`) AGAINST (*?* IN BOOLEAN MODE)", text).
        Find(&rs.Records).
        Error; err != nil {
        utils.Logger.Error("error while preloading artists and genres for record", zap.Error(err))
        return errors.New(err.Error())
    }

它会失败,并显示以下错误:

错误1064:您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解要在第1行‘? in Boolean mode)’附近使用的正确语法

所以很明显,这是因为我加了*,所以我试图避开它:

if err := rs.db.
        Preload("Artist").
        Preload("Genre").
        Where("MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`) AGAINST (\\*?\\* IN BOOLEAN MODE)", text).
        Find(&rs.Records).
        Error; err != nil {
        utils.Logger.Error("error while preloading artists and genres for record", zap.Error(err))
        return errors.New(err.Error())
    }

然而,我也收到了同样的错误.我还试着给它加上转义':

if err := rs.db.
        Preload("Artist").
        Preload("Genre").
        Where("MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`) AGAINST (\\'\\*?\\*\\' IN BOOLEAN MODE)", text).
        Find(&rs.Records).
        Error; err != nil {
        utils.Logger.Error("error while preloading artists and genres for record", zap.Error(err))
        return errors.New(err.Error())
    }

但结果是一样的.

你知道我做错了什么吗?

谢谢.

推荐答案

AGAINST()的参数必须是带引号的字符串、字符串参数或常量字符串表达式.

以下内容无效,因为*个字符需要包含在字符串值中:

AGAINST (*?* IN BOOLEAN MODE)

以下内容也无效,因为参数占位符必须包含在引号内:

AGAINST ('*?*' IN BOOLEAN MODE)

因此,您可以 Select 将表达式创建为字符串文字和参数的串联:

AGAINST (CONCAT('*', ?, '*') IN BOOLEAN MODE)

或者在应用程序中将这*个字符连接到您的模式中,并将其作为参数值传递.

AGAINST (? IN BOOLEAN MODE)

Mysql相关问答推荐

是否有一种方法可以在mysql中设置一列,使其自动成为该行的行号的值?

在mySQL中使用子查询和WHERE子句的JOIN

透视从另一个表添加信息的查询

MySQL逻辑全部

如何将左联接的小计/总计行中的所有列作废

MySQL:获取连续记录的数量(日期)?

从表中动态删除所有空列

Mysql 查询返回未定义的 node.js

MySQL 在第一个匹配行后停止搜索 N 行(不是 LIMIT)

根据使用 mysql 的第一个过滤结果添加更多表行

为什么从我的 SQL 查询中删除 BINARY 函数调用会如此显着地改变查询计划?

如何使用 sequelize 将复合主键放在连接表中?

如何在不违反唯一约束的情况下交换 MySQL 中两行的值?

在 PHP 中获取 MySQL 列的总和

MySQL如何为数据库中的所有表生成DDL

在 PHP/MySQL 中将日期时间存储为 UTC

MySQL 连接运算符

MySQL术语约束与外键的区别?

Python 是否支持 MySQL 准备好的语句?

设计用户角色和权限系统的最佳实践?