私のクエリは次のように表示されます。
SELECT advert_id
FROM oop_adverts
WHERE cat_down = :id
AND province = :province
AND MATCH (location) AGAINST (:location);
実際には:
SELECT advert_id
FROM oop_adverts
WHERE cat_down = 3
AND province = 5
AND MATCH (location) AGAINST ('Krakow');
そして、このクエリを試してみると、mysqlは最終的に0の結果を取得します。問題は、クエリのフレーズを磨くことです。このクエリを次のように置き換えたとき:
SELECT advert_id
FROM oop_adverts
WHERE cat_down = 3
AND province = 5
AND MATCH (location) AGAINST ('Krakow') COLLATE utf8_unicode_ci;`
私が得た:
Syntax error or access violation: 1253 COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'binary''
スクリプトphpとmysqlでどの照合順序を使用すべきかわかりません。手伝って頂けますか?
PS。私の「最高の英語」の仲間に申し訳ありません。
コメントの議論に従って編集:
テーブルスキームは(utf8に関して)問題なく見え、OPで指定した最初のコード例は正しい(照合なしのもの)ので、適切なDB照合と接続自体もあると仮定します-おそらくあなたは行の50%以上でadvert_locationのクラクフ。これが0行の結果を取得する理由です。
全文検索を使用する場合は、テーブルの全文インデックスにデータ行の50%に表示されるキーワードが含まれている場合、そのキーワードは一致クエリによって無視されることを常に覚えておく必要があります。
したがって、代わりに、ブールモードでFull Text Serachを使用して、50%のしきい値をバイパスできます。こちらのドキュメントを確認してくださいMySQLブール全文検索
したがって、たとえば、advert_locationとしてKraków、Krakow、およびWarszawaを含むテーブルに3行がある場合、次のクエリは0行の結果を返します。
SELECT advert_id
FROM oop_adverts
WHERE MATCH(`advert_location`) AGAINST ('Kraków')
ただし、ブールモードを使用すると、2行の結果が得られます。
SELECT advert_id
FROM oop_adverts
WHERE MATCH(`advert_location`) AGAINST ('Kraków' IN BOOLEAN MODE)
複数の単語を照合する場合は、「+」演算子を使用できます(詳細については、上記のリンク先のドキュメントを参照してください)。
SELECT advert_id
FROM oop_adverts
WHERE MATCH(`advert_location`,`advert_title`) AGAINST ('+Kraków' '+Search phrase' IN BOOLEAN MODE)
注意点として、「+」演算子が含まれているバインドされたパラメーターを作成することを忘れないでください。たとえば、PHPを使用している場合は、次のように実行できます。
$query= "SELECT advert_id
FROM oop_adverts
WHERE MATCH(`advert_location`,`advert_title`) AGAINST (:location :title IN BOOLEAN MODE)";
$SQL=$db->prepare($query);
$SQL->bindValue(':location', '+'.$searched_location, PDO::PARAM_STR);
$SQL->bindValue(':title', '+'.$searched_title, PDO::PARAM_STR);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加