我正在尝试编写用于在表上搜索的查询,但是我得到了通用的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
上面的查询将查找给定用户的所有税务记录。
现在我正在尝试制作完全相同的查询,但现在它只是一个“搜索”查询。它接收搜索字符串并在税表的name
和rate
列中查找。就是这样:
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)
答案 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服务器只是在第一次查询(及其终止;
)后报告为“语法错误”所有内容。
不要在一次调用中发送两个查询,也不要使用允许在同一个字符串中进行多个查询的调用(如果库提供了这样的调用)。