2

複数の値を 1 つの SQL フィールドに格納し、このデータ確実に検索できるようにするにはどうすればよいですか?

たとえば、これができるようになりたい

name | num
-----------
John | 21, 22, 34
Mike | 41, 32, 43
Dave | 12, 23, 34


$query = SELECT name from table WHERE num = '12' 
// result should be 'Dave'

また

$query = SELECT name from table WHERE num = '22' or num = 41 
// result should be John and Mike

私はPHPを使用しているので、入力時にデータをシリアライズし、結果の配列をアンシリアライズして検索できることはわかっていますが、データセットは非常に大きいため、データセット全体を取得する必要があるため、クエリが非常に遅くなります。結果の配列をループします。

私が見逃したかもしれないものはありますか?絶対にたくさんのグループとそれぞれに多くのオプションがあるため、可能なオプションごとにテーブルを作成する必要はありません。

何か案は?前もって感謝します

編集:上記の例は単なる例であり、任意の数の「数値」が存在する可能性があります

4

4 に答える 4

3

最適な速度と効率を得るには、IDにリンクする別のテーブルに「nums」を配置します。

LIKEの使用も機能しますが、文字列の一部との比較も行う必要があります。データセットのサイズによっては、これにも時間がかかる場合があります。

別のオプションは、単語の境界を使用するmysqlregexです。

SELECT name from table where nums REGEXP '[[:<:]]##[[:>:]]';

これらの各オプションは機能しますが、特に多くの可能性がある場合は、データを別のテーブルに移動することが適切な方法です。

この方法では、3つのテーブルが必要になります

People
-------
ID
NAME

Options
-------
ID
OPTION

Options_People
--------------
OPTION_ID
PEOPLE_ID

特定のオプションを持つすべての「人」を取得するには、次のようにします。

SELECT p.* FROM People p, Options_People op 
WHERE p.ID = op.PEOPLE_ID and OPTION_ID = #option#

複数のオプションのいずれかですべての「人」を取得するには:

SELECT p.* FROM People p, Options_People op 
WHERE p.ID = op.PEOPLE_ID and OPTION_ID IN ( #option1#,#option2#,#option#)
于 2010-12-17T15:20:39.440 に答える
2

そのようにする必要があります:

組み合わせごとにエントリを作成します。

John | 21
John | 22
John | 23
Mark | 19
Mark | 22

youtable に追加情報がある場合は、2 つのテーブルを作成します。

Users:
UserId |FirstName |Lastname
1      |John      |Doe
2      |Mark      |Hamill

   Options:
    UserId |Num
          1| 21
          1| 22
          1| 23
          2| 19
          2| 22

列が 1 つしかない既存のデータベース構造に固執する必要がある場合は、 それを text/varchar として格納できます。文字列の先頭と各数値|21|21|23|の後にパイプ(またはその他の文字)を配置するだけです。次に、LIKE '%|23|%' で検索できます。

これは非常に遅くて醜いですが、テーブルや aolum を追加できない場合があります。

于 2010-12-17T15:10:40.380 に答える
0

name to num ピボット テーブルは、おそらくこれを行う最もエレガントな方法です。

于 2010-12-17T15:02:46.187 に答える
0

SELECT name,GROUP_CONCAT(num) FROM table_name GROUP BY name

于 2013-02-05T21:33:04.107 に答える