これはMySQLSETタイプであり、データセットを64アイテムに抑えることができる(または、他の条件に基づいて複数のセットを使用できる)ことを前提としています。
セットの力がわからない人もいると思うので、答えを広げてみようと思いました。表の例:
CREATE TABLE `Test` (
`setid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`setname` varchar(64) NOT NULL,
`setstate` set('AK','AL','AR','AZ','CA','CO','CT','DC','DE','FL','GA','HI','IA','ID','IL','IN','KS','KY','LA','MA','MD','ME','MI','MN','MO','MS','MT','NC','ND','NE','NH','NJ','NM','NV','NY','OH','OK','OR','PA','RI','SC','SD','TN','TX','UT','VA','VT','WA','WI','WV','WY') NOT NULL,
PRIMARY KEY (`setid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
insert into `Test` values('1','test','AZ,CA,NJ,NM,NY,VA,VT');
状態には単一のセットフィールドを使用することに注意してください。より複雑な使用には複数のセットの使用が必要になる可能性がありますが、各レコードの水平方向のqwordを少し増やすと、ルックアップテーブルに大量のレコードに簡単に到達できる多数の追加の結合操作を追加するよりも安価になる場合があります。
以下は、3つの(機能的に)同等のプルです。ビットマスクは、このデータをプルするための非常に高速な方法であることに注意してください。
SELECT * FROM Test WHERE setstate & 1000;
テスト#1では、リスト(AZ)の項目#4に対応するため、ビットマスクとして1000を使用します。これは、はるかに最速の方法です...そして、より速い結果の可能性を与えるこのデータを保存するいくつかの方法があります。
SELECT * FROM Test WHERE setstate LIKE '%AZ%';
このメソッドはインデックスを使用できますが、あいまい一致のために多少遅くなります。
SELECT * FROM Test WHERE FIND_IN_SET('AZ',setstate);
この方法はあいまい一致よりも高速ですが、その性質上、ほとんどの実際の使用では一時テーブルを使用する必要があります。