0

地区テーブルがあり、ユーザーの優先地区を地区テーブル district_id (varchar(250)) field(column) に格納します。このフィールドに格納される値は、\n を使用して 1 2 5 6 1 のようになります。教えてください、この特定の列を検索するにはどうすればよいですか?

4

4 に答える 4

3

しないでください。あなたのデザインは絶対にひどいものであり、これがそもそもこの問題を抱えている理由です.

NN 関係がある場合 (ユーザーは多くの優先地区を持つことができ、各地区は多くのユーザーに好まれる可能性があります)、両方のテーブルへの外部キーを持つ中間テーブルを作成する必要があります。

必要なもの:

  1. 地区に関する情報のみを含む地区のテーブル。
  2. ユーザーに関する情報のみを含むユーザーのテーブル。
  3. 地区番号とユーザー ID を列として、外部キー制約を使用した、ユーザーごとの優先地区のテーブル。これにより、どのユーザーも簡単なクエリで無制限の数の優先地区を持つことができます。
于 2013-09-20T11:13:34.097 に答える
0

最も簡単な方法は、次のように 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

このように、必要なレコードを取得するのは非常に簡単です...

于 2013-09-20T11:17:11.590 に答える
0

そのように保存されたデータに対して検索を実行することはお勧めしませんが、行き詰まった場合は正規表現で実行できます。

文字列の開始と終了の一致も処理する必要があります。だから常連LIKEは通用しない。

MySQL の正規表現

この 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 を使用する必要があることに注意してください。

于 2013-09-20T11:15:52.037 に答える
0

私は mysql 関数 FIND_IN_SET() を使用しましたが、この関数によって目的の結果が得られました。

私はこのチュートリアルから助けを得ました。 http://www.w3resource.com/mysql/string-functions/mysql-find_in_set-function.php

于 2016-11-09T16:21:24.733 に答える