2017-08-01 22 views
0

私はMySQLデータベース内に2つのフィールドを持っています。データ型は、(DC2Type:array)のCommentを持つLONGTEXTとして表示されます。例えばデータベースアレイの値(整数または文字列)の検索

、このフィールドに格納された整数値は、次のようになります。
a:4:{i:0;i:9;i:1;i:10;i:2;i:11;i:3;i:12;}

と文字列値は、次のようになります。
a:2:{i:0;s:6:"Value1";i:1;s:6:"Value2";}

私は、これらのフィールドにこの方法が必要ですので、私フィルタリング可能な列を格納できます。例えば。第1のものは年齢グループであるので、9,10,11,12歳が表される。

その後、私は10と11

私はINとFIND_IN_SET構文を試みたが、いずれでもないきなものを見つけたいと言う10歳のためか、いくつかのケースでは関連があると言うすべてのレコードを取得する必要があります私のクエリ結果を返します。 IN

FIND_IN_SET

SELECT * 
FROM table_name 
WHERE FIND_IN_SET(MyField,'Value1') > 0; 

を使用して

SELECT * 
FROM table_name 
WHERE MyField IN (10) 

を使用して

私は配列は、おそらくに値を格納するための最良の場ではありません知っているが、私は、各AgeGroup例えばのための別々のフィールドを持っている必要はありませんでした年齢1、年齢2など、各カテゴリ(例:Value1、Value2など)

データベース配列フィールドからの値や値の検索方法について考えてください。

ありがとうございます!

+0

このデータはPHPの 'serialize()'形式です。 MySQLで直接処理する簡単な方法はありません。すべてのレコードを取得し、 'unserialize()'を使ってそれをテストする必要があります。 – Barmar

+0

'FIND_IN_SET'はコンマ区切りの値でのみ動作します。あなたのフィールドの値は ';'ではなく ';'で区切られています。 – Barmar

答えて

0

パターンマッチを使用できます。

整数:

WHERE MyField LIKE '%i:10;%' 

文字列:

WHERE MyField LIKE '%s:6:"Value1";%' 

6は、あなたが探している文字列の長さに交換しなければなりません。あなたは、複数の数字や文字列を検索したい場合は

、あなたが交代で正規表現を使用することができます。

WHERE MyField RLIKE 'i:(10|11);' 

WHERE MyField RLIKE 's:(6:"Value1"|10:"LongValue2");' 

注これらの方法のいずれもが、テーブル上のインデックスを利用することができないこと。通常、データベース列に配列を格納するのは悪い考えです。多対多の表に配列を別々の行として格納する必要があります。

+0

ありがとう! LIKEとRLIKEは両方とも、MySQLの整数と文字列の両方で示されているように動作します。私はSymfony/Doctrineを使用していますので、残念ながらRLIKEはサポートされていないようです。シリアライズされた配列ではなく、多対多にアーキテクチャを変更できるようになるまで、フィルタの条件をただ一つの結果に変更する必要があります(私たちはLIKEを使用できます)。クイックレスポンスとサポートを気に入ってください。 – mbg

+0

'RLIKE'は' REGEXP'の別の名前です。 – Barmar

+0

複数の大文字と小文字を区別しないため、 'LIKE'を使用することはできません。あなたは 'MyField LIKE '%i:10;%'またはMyField LIKE '%i:11;%'' – Barmar

関連する問題