2017-07-29 10 views
0

テーブルの検索クエリを作成しようとしていますが、一般的な1064 MySQL構文エラーが発生しています。私は質問に間違ったものは見当たりません...実際、うまく動作するような別のクエリがあります。MySQLエラー1064:検索クエリが期待どおりに動作しない

クエリはGoでSQLドライバを使用していますが、?はすべてクエリが実行される前に値に変換されます。

これは私の誤りである:例えば

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT tax.* FROM tax JOIN user_tax ON user_tax.tax_id = tax.id WHERE u' at line 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) 
+1

あなたのインターフェイスでは1つのクエリのみが渡されます。使用しているインターフェイスに適切なパラメータを使用する方法を学ぶことをお勧めします。 –

+0

ああ、私は '%s'の代わりに'? 'を付けるつもりでした。私のコードだけでなく質問も更新されました。まだ同じエラーが発生しています。 – Lansana

+0

また、 '@ query'を' @ searchString'に変更したので、クエリをクエリに入れようとしていませんでした。 – Lansana

答えて

1

SET @queryを行うと、あなたが使用してバインド・パラメータを使用してそれを行うことができたときに、その中にそれを渡すために、なぜ私は理解していません?

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) 

OR(私はそれが動作するかはわからない)、これを試してください:だからここ

は、溶液(私はgoに慣れていないよgoコードで何か間違っている場合に残念そうしてください)です

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) 
+0

はい、これはうまくいきますが、 'query'をN回渡す必要はありません。もし私が30列のようなものを持っていたら...これがなぜクエリ内の変数を設定しようとしていたのですか?ただ一つのものにバインドしてからそれを再利用するだけです。 – Lansana

+1

@Lansanaはあなたの冗談ですか?ときに厳密なSQLクエリをなぜ動的な瞬間を考えるか? – num8er

+0

これは、SQLの経験が最小限の人から来ていますが、通常はプログラミングで値をメモしてDRYを維持するために使用します。私はそれがSQLでどのように動作するのではないかと思いますか? – Lansana

1

のMySQLで報告された構文エラーが「「近くに使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください」クエリ股関節の末尾の部分に続いて魔法の言葉が含まれていますすでに解析されていて正しいと見なされている先頭部分には適合しません。

エラーメッセージで報告されたクエリの一部が間違って表示されない場合は、通常、その前に何かが見つからないことがあります。

あなたのケースでは何も見当たりません。結論としては、2つのクエリ(正確には;で区切られています)を実行しようとしましたが、サーバーにクエリを送信するために使用するライブラリは、 1つのクエリだけです。接続の反対側でも同じことが起こります。そして、MySQLサーバは最初のクエリの後に見つかったすべての "構文エラー"を報告します(そして終了するのは;です)。

単一の呼び出しで2つのクエリを送信したり、同じ文字列内で複数のクエリを許可する呼び出しを使用しないでください(呼び出しがライブラリによって提供されている場合)。あなたは同じ値を複数回結合避けたい場合は

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%を最初のパラメータとして。

+0

これはパフォーマンスに大きな影響を及ぼしますか? – Lansana

+0

@Lansana私は参照していますあなたが望む簡単な解決策。ニース! – num8er

+0

@Lansana - パフォーマンスに関する問題はありません。サブクエリは一度だけ実行する必要があります。 –

関連する問題