0

php / mysqlアプリのカスタムスキーマをSELECTクエリで組み合わせることができることを理解するために取り組んでいますが、その関係についてはよくわかりません。私は新人プログラマーであり、ネット上で特定の情報を見つけるためにこの関係を説明する能力が不足しています。このスキーマを設計するための擬似コードまたは技術用語を探しています。

以下に示すように、説明するのに十分シンプルです。また、SQLコマンドを擬似コードとして通知するロジックを試してみました。そこでデコードしたところ、助けを求めなければなりませんでした(9_9)

これは、2つのテーブルを使用する分類スキーマです。最初の表には、用語と重みベースの順序(最低から最高)の値が含まれています。2番目のテーブルは、最初のテーブルの親子関係を指定します。興味深いことに、最初のテーブルの子の重みは、親mの重みが子の重みnにインデックスを付ける多次元配列の2番目の値のように機能します。taxonomy_term_weight[ m ][ n ]のようなもの

table_a                table_b on table_a.ID 
+-----+------+-----+...+-----+ 
| ID  | TRM  | WT  |...| P   | 
+-----+------+-----+...+-----+ 
|1    |  3   | [9] |...| [0] | 
|2    |  1.1 | [0] |...| [9] | 
|3    |  2   | [8] |...| [0] | 
|4    |  2.1 | [0] |...| [3] | 
|5    |  2.2 | [1] |...| [3] | 
|9    |  1   | [5] |...| [0] | 
+-----+------+-----+...+-----+ 
table_a = term table,
table_b = hierarchy table
TRM= TERM, WT= WEIGHT, P=PARENT

擬似コードでの私の試み。論理的には、最初のアイテムを取得するには、P = 0(親がなく、このスキーム自体が親であることを意味します)のレコードを見つける必要があり、その重み値は最小(最初のアイテムを意味します)である必要があります。擬似コードでこのようなもの、

table_a.ID=table_b.P=0 AND table_a.WT=[lowest value] //e.g. P=0, WT=5, Therefore ID=9;

結果のIDは、子レコードを検索するための親IDになります。

table_a.ID=table_b.P AND table_a.WT[lowest value] //e.g. P=9, WT=0, Therefore ID=2;

に続く、

table_a.ID=table_b.P AND table_a.WT=[lowest value] //e.g. P=2, WT=0, Therefore ID=none;

しかし、私が欲しいのは同じ親であり、重みが増加しています。

P=9, WT=1, Therefore ID=none;

テーブルをつなぎ合わせるのは理解できますが、これはジズザグまたは振動しているようです。私がすぐに気付くのは、私が理解していない深さの複雑さがあるということです。

4

1 に答える 1

0

最後に「重みが増加した」ビットが何を意味するのかわかりません(何から/どこから増加しますか?)-しかし、これはおそらく以下に十分に簡単に追加できます...だから、私の頭の上から関数/sprocまたは専用ビューなしで単一のクエリが必要であると仮定すると、次のようになります。

[注: これは私の頭のてっぺんから手書きで書かれたものであり、いくつかの調整、スペル チェック、および非常に可能性の高い最適化が必要になる場合があります。データベースに依存しないようにするための asni sql でもあります (ある程度まで)]

select ID3 from
( 
  select id as id1, min(wt) as w1 from table_a A1 Inner join table_b B1 on A1.id = B1.p
  where p=0
) Q1
inner join
( 
  select id as id2, min(wt) as w2 from table_a A2 Inner join table_b B2 on A2.id = B2.p
) Q2
on Q1.id1 = Q2.id2
inner join
( 
  select id as id3, min(wt) as w3 from table_a A3 Inner join table_b B3 on A3.id = B3.p
) Q3
on Q3.id3 = Q1.id1

編集:明確にするために追加されました...問題の私の理解はこれです。例から、ゼロの P 値を入力します (これはおそらく最終解の変数になります)。このクエリ (block1) は、2 つのテーブル a と b を結合し、ID (2) を返します。これは、同じクエリに戻す必要があります (テーブル a からの ID の再一致のために、P=0 を P=2 に置き換えます)。

この時点で、例は現在返されている ID (5) を示していますが、実際にはブロック 1 (p=9) の ID を使用する必要があるため、ここでの 3 番目のブロックは P の最初のクエリに対して結合されます (出力は id1 として)。

これは、2 番目のブロック (Q2) の出力がまったく使用されていないことを意味するため、上記の私のコメントです。

ちなみに、これが行っているのは、テーブル a とテーブル b の間の結合をそのレフ内の仮想テーブルとして使用しているだけです。これは、クエリをいくらか単純にする(少なくとも読みやすくする)ビューで実現できます。

これが実際に必要なものではない場合、特定の例で手順がどのように相互作用する必要があるかについてのより良い説明が必要です (ソリューションの現在の内容ではなく、何が必要か)。ここで問題が発生することはないと思います。単一のクエリでデータベース レベルですべてを実行できるようです。ただし、これらのテーブルのサイズが大きい場合は、インデックス作成を検討する必要があるかもしれません (これは、ビューが役立つ場合でもあります (ビュー インデックス)。または、SPROC と一時テーブルを使用してインデックスを作成できます)。

于 2012-08-10T17:44:22.880 に答える