2

私の現在のクエリは次のようになります。

$query = "SELECT * FROM t WHERE (data LIKE '$findme') OR (data LIKE '%$findme|%') OR (data LIKE '%|$findme%')";

この列のデータには、パイプ記号 ("|") で区切られたアイテムが含まれており、このフィールド内のアイテムの出現を含むすべてのレコードを検索するクエリが必要です。また、この列に項目が 1 つしかない場合、「|」はありません。シンボルが存在します。

例:

$findme = "12";

クエリは一致する必要があります:

13|23|12
12
12|23
3|12|42

クエリは一致しません:

123|32
34|123

REGEXP を使用するとこれが簡単になるかどうかはわかりませんが、そうであれば、どんな解決策も歓迎します。ありがとう!

SQLFiddle の例: http://sqlfiddle.com/#!3/32afd/5

4

1 に答える 1

3

REPLACE()との組み合わせを使用して、をカンマにFIND_IN_SET()置き換え、パイプ区切りのセットで値を見つけることができます。|$findme

SELECT * 
FROM table
/* Replace | with , and search in the set */
WHERE FIND_IN_SET('$find_me', REPLACE(data, '|', ',')) > 0

これは、区切り値にdataコンマが含まれていない場合にのみ機能することに注意してください。

長期的には、これに対する適切な解決策は、区切られた列dataを別の適切に正規化された 1 対多のテーブルに分離することです。

于 2012-08-18T18:46:29.537 に答える