0

私はinnoDBテーブルを持つMySqlデータベースを持っています。非常に単純化されたこれは、2つのテーブルのレイアウト方法です。

表A:

  • controlID(PK)
  • controlText

表B:

  • controlOptionID(pk)
  • controlID(テーブルAへのFK)
  • controlOptionType
  • controlOptionValue

非常に多くのcontrolOptions(テーブルB)が1つのコントロールを参照できます(複数のオプションを制御することができます)。ただし、オプションごとに、テーブルBに2つの行が作成されます。1つの行はcontrolOptionType ="linkToCreator"およびcontrolOptionValue=(作成元のテンプレートへのID *)です。そして、他の行タイプ="optionSelected"およびvalue= "true"(またはfalse)。

  • =非常に複雑な設定ですが、基本的には、列を設定する代わりに、列が呼び出されるタイプを使用して動的な列を作成しています。そのため、FKでテンプレートにリンクできませんでした。

したがって、1つのcontrolOptionValue値がtrueまたはfalse(必要なものに応じて)で、もう1つのcontrolOptionValueが指定したテキストIDであるすべてのコントロール(2つのcontrolOptionsがリンクされている)を選択する必要があります。

私がそれをするための最良の方法だと思うのは

SELECT * FROM tableB WHERE controlOptionType = 'linkToCreator'

次に、その結​​果セットをループして、次のようにします。

SELECT * FROM tableB WHERE tableB.controlID = (the controlID in this iterations row) AND tableB.controlValue = 'true'

しかし、おそらくそれは本当に非効率的であり、どちらにしても私にはそれを行う方法の手がかりがありません。templateIDとtrueまたはfalseを指定した単一のクエリ(つまり、ストアドプロシージャを使用しない)を取得でき、何も見つからなかった場合に行の結果が得られれば素晴らしいと思います。

ところで、これはアプリケーションでの検索用であり、パフォーマンスが最優先されるように、大量の行を処理する必要があります。そして、はい、私はセットアップが最高ではないことを知っています...

ありがとう

4

2 に答える 2

4

このような?

SELECT * FROM tableA AS A
LEFT JOIN tableB AS ctrl1 ON (A.controlID = ctrl1.controlID AND ctrl1.controlOptionType = ? AND ctrl1.controlOptionValue = ?)
LEFT JOIN tableB AS ctrl2 ON (A.controlID = ctrl2.controlID AND ctrl2.controlOptionType = ? AND ctrl2.controlOptionValue = ?)

于 2010-07-26T22:38:03.797 に答える
0

これを試して:

SELECT * 
FROM Table_A 
LEFT JOIN Table_B
ON Table_A.ControlID = Table_B.ControlID
WHERE Table_A.controlOptionType = 'linkToCreator
于 2010-07-26T22:52:12.813 に答える