0

ID から名前への基本的な静的データを含むいくつかのテーブルを含む DB があります。これらの参照テーブルのそれぞれにある 2 つの列のみ。

次に、ユーザーが入力したデータを受け取る別のテーブルを作成します。ユーザー入力の各インスタンスには、タイムスタンプ付きの独自の行がありますが、ここで重要な列には、他のテーブルのいずれかの名前に関連する ID が 1 つまたは複数含まれます。この情報を送信および取得しやすくするために、json 形式のテキストとして入力することにしました。

ID の名前を参照するために大きなテーブルを小さなテーブルと結合する必要があることに気付くまで、すべてが順調に進んでいました。結果にもIDを返す必要があります。

このテーブルのいくつかの行がどのように見えるかの例:

Column 1                            | Column 2                  | Timestamp
["715835199","91158582","90516801"] | ["11987","11987","22474"] | 2012-08-28 21:18:48
["715835199"]                       | ["0"]                     | 2012-08-28 21:22:48
["91158582","90516801"]             | ["11987"]                 | 2012-08-28 21:25:48

このテーブルには ID# の入力が繰り返されますが、必ずしも同じグループにあるとは限りません。

することは可能WHERE name='any-of-these-json-values'ですか?メイン テーブルにクエリを実行して、含める必要がある名前の ID を取得した後、php でゲットー ジョインを行うのが最善でしょうか? それとも、データ入力テーブルの設計を完全にやり直す必要がありますか?

4

1 に答える 1

1

初めに:

個別にアクセスしたい場合は、1 つのフィールドに複数の情報を入力しないでください。一度もない。

とはいえ、結合テーブルを含む完全なリレーションを作成する必要があると思いますN:M。例のテーブルの 1 行を、結合テーブルの 1 ~ N 行に置き換える必要があります。

文字列マッチングを伴うトリッキーな結合は、非常に少数の行に対してのみ許容範囲内で実行WHERE name='any-of-these-json-values'されますが、これは構成では不可能です。MySQL は、これが JSON 配列であることを「理解」していません。つまり、構造化されていないテキストと見なします。結合テーブルでは、この句は非常に自然に次のようになります。WHERE somecolumn IN (1234,5678,8012)

編集

Column 1ID の配列を含み、ID の配列table1Column 2運ぶと仮定すると、次のtable2ようにする必要があります。

CREATE TABLE t1t2join (
  t1id INT NOT NULL ,
  t2id INT NOT NULL ,
  `Timestamp` DATETIME NOT NULL ,
  PRIMARY KEY (t1id,t2id,`Timestamp`) , 
  KEY (t2id)
)

(キーのサニティチェックが必要になる場合があります)

そして、挿入時に次のことを行います(疑似コードで)

Remember timestamp
Cycle all permutations of (Column1,Column2) given by user
Create row

したがって、3 番目の例の行では、SQL は次のようになります。

SELECT @now:=NOW();
INSERT INTO t1t2join VALUES
  (91158582,11987,@now),
  (90516801,11987,@now);
于 2012-08-29T22:29:55.100 に答える