MySQL错误1064:搜索查询无法按预期工作

时间:2017-07-29 11:52:51

标签: mysql sql go

我正在尝试编写用于在表上搜索的查询,但是我得到了通用的1064 MySQL语法错误。我没有看到我的查询有任何问题...事实上,我有另一个查询,就像它可以正常工作。

查询在Go中使用SQL驱动程序,在运行查询之前,所有?都将转换为值。

这是我的错误:

  

错误1064:您的SQL语法出错;检查与您的MySQL服务器版本对应的手册,以便在'SELECT tax'附近使用正确的语法。*           来自税收           加入user_tax               ON user_tax.tax_id = tax.id           你在第3行的哪个地方

例如,这是工作查询:

SELECT tax.*
FROM tax
JOIN user_tax
    ON user_tax.tax_id = tax.id
WHERE user_tax.user_id = ?
    AND tax.deleted_at IS NULL
    AND user_tax.deleted_at IS NULL

上面的查询将查找给定用户的所有税务记录。

现在我正在尝试制作完全相同的查询,但现在它只是一个“搜索”查询。它接收搜索字符串并在税表的namerate列中查找。就是这样:

SET @searchString = '%?%';

SELECT tax.*
FROM tax
JOIN user_tax
    ON user_tax.tax_id = tax.id
WHERE user_tax.user_id = ?
    AND tax.deleted_at IS NULL
    AND user_tax.deleted_at IS NULL
    AND tax.name LIKE @searchString
        OR tax.rate LIKE @searchString

这是代码中的查询:

var taxes []Tax
err := r.db.Select(&taxes, `
    SET @query = '%?%';

    SELECT tax.*
    FROM tax
    JOIN user_tax
        ON user_tax.tax_id = tax.id
    WHERE user_tax.user_id = ?
        AND tax.deleted_at IS NULL
        AND user_tax.deleted_at IS NULL
        AND tax.name LIKE @query
            OR tax.rate LIKE @query
`, q, userId)

3 个答案:

答案 0 :(得分:2)

如果要避免多次绑定相同的值,可以在交叉连接的子查询中绑定它一次并重用该值:

SELECT tax.*
FROM tax
JOIN user_tax
    ON user_tax.tax_id = tax.id
CROSS JOIN (SELECT ? as q) sub
WHERE user_tax.user_id = ?
    AND tax.deleted_at IS NULL
    AND user_tax.deleted_at IS NULL
    AND (tax.name LIKE sub.q
         OR tax.rate LIKE sub.q)

现在只需绑定%s%作为第一个参数。

答案 1 :(得分:1)

我不明白为什么要做SET @query并在你可以通过使用?使用绑定参数来执行它时将其传递给它。

所以这是解决方案(我不熟悉go所以如果go代码有问题,请抱歉:

var taxes []Tax
query := "%something%youre%looking%for%"
err := r.db.Select(&taxes, `

    SELECT tax.*
    FROM tax
    JOIN user_tax
        ON user_tax.tax_id = tax.id
    WHERE user_tax.user_id = ?
        AND tax.deleted_at IS NULL
        AND user_tax.deleted_at IS NULL
        AND (
              tax.name LIKE ? 
              OR 
              tax.rate LIKE ?
            )

`, q, userId, query, query)

或试试这个(我不确定它是否有用):

var taxes []Tax
query := "something"
err := r.db.Select(&taxes, `
    SET @query = CONCAT('%', ?, '%');

    SELECT tax.*
    FROM tax
    JOIN user_tax
        ON user_tax.tax_id = tax.id
    WHERE user_tax.user_id = ?
        AND tax.deleted_at IS NULL
        AND user_tax.deleted_at IS NULL
        AND (
              tax.name LIKE @query
              OR 
              tax.rate LIKE @query
            )

`, q, query, userId)

答案 2 :(得分:1)

MySQL报告的语法错误包含神奇的单词“检查与您的MySQL服务器版本对应的手册,以便在'附近使用正确的语法,然后查询的尾随部分不适合已经解析并找到正确的前导部分。

当错误消息中报告的部分查询看起来不正确时,通常会在它之前缺少某些内容。

在你的情况下似乎没有什么遗漏,这导致一个结论:你尝试运行两个查询(正确地由;分隔)但你用来向服务器发送查询的库不知道那并且认为它只是一个查询。在连接的另一端发生同样的事情,MySQL服务器只是在第一次查询(及其终止;)后报告为“语法错误”所有内容。

不要在一次调用中发送两个查询,也不要使用允许在同一个字符串中进行多个查询的调用(如果库提供了这样的调用)。