地区テーブルがあり、ユーザーの優先地区を地区テーブル district_id (varchar(250)) field(column) に格納します。このフィールドに格納される値は、\n を使用して 1 2 5 6 1 のようになります。教えてください、この特定の列を検索するにはどうすればよいですか?
4 に答える
しないでください。あなたのデザインは絶対にひどいものであり、これがそもそもこの問題を抱えている理由です.
NN 関係がある場合 (ユーザーは多くの優先地区を持つことができ、各地区は多くのユーザーに好まれる可能性があります)、両方のテーブルへの外部キーを持つ中間テーブルを作成する必要があります。
必要なもの:
- 地区に関する情報のみを含む地区のテーブル。
- ユーザーに関する情報のみを含むユーザーのテーブル。
- 地区番号とユーザー ID を列として、外部キー制約を使用した、ユーザーごとの優先地区のテーブル。これにより、どのユーザーも簡単なクエリで無制限の数の優先地区を持つことができます。
最も簡単な方法は、次のように LIKE クエリを使用することです。
SELECT * FROM `preferred_districts` WHERE `district_id` LIKE '%6%';
それがあなたが受け取る正しいものであることを確認するには (これは ID 16、26、674 などにも一致するため)、それが正しいかどうかを手動で確認する必要があります。php (使用するかどうかはわかりません) では、以下のスニペットを使用できます。
$id_field = '1 2 5 6 17';
$ids = explode("\n", $id_field);
if(in_array(6, $ids)) {
echo 'Yup, found the right one';
}
重要上記は機能しますが、データベースの設計は本来あるべきものではありません。以下のように、地区とユーザーの間にピボット テーブル (と呼ばれることもあります) を作成する必要があります。
(Table 'users_preferred_districts')
user_id | district_id
--------+------------
2 | 1
2 | 17
9 | 21
このように、必要なレコードを取得するのは非常に簡単です...
そのように保存されたデータに対して検索を実行することはお勧めしませんが、行き詰まった場合は正規表現で実行できます。
文字列の開始と終了の一致も処理する必要があります。だから常連LIKE
は通用しない。
この SQL を試してみてください。番号を検索するには5
SELECT * FROM `TABLE` WHERE `field` REGEXP '\\n?(5)\\n?';
機能を利用してマッチングしたい場合LIKE
。複数のルールを使用して実行できます。
SELECT * FROM `TABLE` WHERE `field` LIKE '%\\n5\\n%' OR LIKE '5\\n%' OR LIKE '%\\n5';
\
新しい行をエスケープするには double を使用する必要があることに注意してください。
私は mysql 関数 FIND_IN_SET() を使用しましたが、この関数によって目的の結果が得られました。
私はこのチュートリアルから助けを得ました。 http://www.w3resource.com/mysql/string-functions/mysql-find_in_set-function.php