2017-10-25 52 views
0

matchingに問題があります。find_in_setです。カンマ区切りの複数の値と一致しません。以下はfind_in_setがカンマで区切られた値ではなく、単一の値にのみ一致するのはなぜですか?

私は...、この表を事前に

+-----------------------+ 
|  skills   | 
+-----------------------+ 
|  php   | => matches 
+-----------------------+ 
| php,laravel,html  | => does not match--why? 
+-----------------------+ 
|  html   | => matches 
+-----------------------+ 
|php,html,laravel,nodejs| => does not match -- why? 
+-----------------------+ 

感謝を上記のクエリを

$skills = array('php','html','laravel','nodejs'); 

$skills = implode(',', $skills); 

$sql = "SELECT * FROM jobs_posted_by_employer WHERE FIND_IN_SET(skills, :array)"; 

$stmt = $db->prepare($sql); 

$stmt->bindParam('array', $skills); 

を試してみましたが、何です!

+2

データを正規化します。可能であれば、テーブルにCSVを保存しないでください。このようにして 'FIND_IN_SET'を使うことはできません。 –

+1

find_in_setはカンマ区切りの値で単一の値を検索するためのもので、カンマ区切りの値をコンマ区切りの値で検索していると思います。私は意味がありますか? – rahulsm

+0

@rahulsm、 ''カンマ 'に' 'マッチさせたいです。はい、あなたは正しいです –

答えて

1

FIND_IN_SETの仕組みが間違っています。

  • FIND_IN_SET('html', 'php,html,laravel,nodejs')文字列'html'がセット'php,html,laravel,nodejs'にあるため、真です。
  • FIND_IN_SET('php,laravel,html', 'php,html,laravel,nodejs')は、'php,laravel,html'という文字列が'php,html,laravel,nodejs'にないため、falseです。

データベーステーブルの列に値を区切って格納しないでください。データを簡単に照会するために、各スキルを各jobs_posted_by_employerレコードにリンクする別のテーブルを用意してください。

+0

あなたは正しいですが、私は上記の例では、私のテーブル内のすべての値と一致する必要がある 'php、html、laravel、nodejs 'の値に対して' match'したいです –

+1

だから、あなたは交差を構築する関数が必要でしょう( '' php、laravel、html''と '' php、html、laravel、nodejs''の '' html、php ''となります)、空であるかどうかを確認してください。そのような機能は利用できません。多分、MySQLでそのような関数を書くことは可能です。知りません。とにかく、リレーショナルデータベースではコンマ区切りの値を決して格納しないでください。代わりにテーブルを正規化してください。 SQLは文字列を混乱させるように設計されていません。 –

関連する問題