のように、カンマで区切られた複数の値を持つ各行にセルを持つテーブルがありますTAGS=1,2,3,4,5
。たとえば TAG 5 を含むすべての行を選択するにはどうすればよいですか?
を試しましたが、たとえば =2 の場合、12 または 22 も選択されるためSELECT * FROM videos WHERE tags LIKE %$id%
、問題が発生し$id
ます...
アイデアはありますか?
のように、カンマで区切られた複数の値を持つ各行にセルを持つテーブルがありますTAGS=1,2,3,4,5
。たとえば TAG 5 を含むすべての行を選択するにはどうすればよいですか?
を試しましたが、たとえば =2 の場合、12 または 22 も選択されるためSELECT * FROM videos WHERE tags LIKE %$id%
、問題が発生し$id
ます...
アイデアはありますか?
FIND_IN_SET()
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-sethttp://sqlfiddle.com/#!2/5a699/1
を使用しselect * from videos where FIND_IN_SET('22',tags)>0;
ます
ああ、私はずっと前にこれをしました-そして、私が問題をどのように攻撃したかについての天才だと思ったとき、それは私の人生で最大の間違いでした。ご覧のとおり、「Like」はかなり高価な比較演算子であり、何かを検索するのに時間がかかります。特に、そこにパーセンテージを入力した分です。
異なるIDを各行にリンクする個別のテーブルを作成することをお勧めします。ルックアップはめちゃくちゃ速くなります。
ただし、上記の問題を解決する必要があります。列の先頭または末尾にコンマが含まれるように更新してから、前後にコンマが含まれるものを検索することをお勧めします。
例えば
LIKE '%,12,%'
where
ステートメントを次のように設定します。
where concat(',', tags, ',') like concat('%,', 5, ',%')
あなたの場合、これは次のようになります。
where concat(',', tags, ',') like concat('%,', $id, ',%')
つまり、区切り文字が探している値の前後にあることを確認する必要があります。したがって、右辺は として評価され'%,5,%'
ます。次に、リストのすべての要素が区切り記号で囲まれ、最初と最後の要素が含まれていることを確認する必要があります。