web-dev-qa-db-ja.com

MySQLで決定された値に等しい名前のテーブルを結合する方法は?

現在取り組んでいる(PHPおよびMySQLベースの)Zend Framework 2アプリケーションのモデルには、説明されているものと同様の継承が含まれています here

これをデータベースにマッピングするために、私は Class Table Inheritance 設計パターンを使用しています。

私は少し浮気して、「スーパーエンティティ」(つまりスーパータイプ)に知らせます。どのタイプの「サブエンティティ」(つまりサブタイプ)がそれに属しているかを知らせます。つまり、「スーパーエンティティ」には、typeという名前のプロパティ(つまり、属性または列)があります。値はキャメルケースです(アプリケーションでの使用を容易にするため)。テーブル名には常に下線が引かれます。

これは私のデータベース構造を示す図です

ERM/PDM

そして私のアプリケーションプログラムオブジェクトのクラスモデルを表示する図

class model

問題は今検索です。 Carid=123で取得したいのですが、最初はわかりません。どのtypeがあり、どのcar_*テーブルが必要なのかJOIN。まあ、すべてのcar_*テーブルを毎回JOINingするか、2つのリクエストを作成するか(最初のものが「事前リクエスト」のようなもので、typeSELECT type FROM car;)ですが、もっと良い解決策があるはずです。

どのようにSELECT/JOIN a TABLEを変数名で使用すると、別のTABLEで選択した値と同じになります?

2
automatix

すべてのテーブルに描画せずに直接行うことはできません。最初に必要なテーブル名を選択してから、アドホックSQLを使用するか、テーブルごとに特定のプロシージャを呼び出してデータを取得する必要があります。

次のようにすべてのテーブルを描画すると機能します。

SELECT ac.carID, ac.type, ac.commonAttribute1, ac.commonAttribute2
     , ct.specialAttributeA
     , ca.specialAttributeB
     , cb.specialAttributeC
FROM   AbstactCar ac
LEFT OUTER JOIN
       CarTesla ct ON ct.carID = ac.CarID
LEFT OUTER JOIN
       CarAstonMamn ca ON ca.carID = ac.CarID
LEFT OUTER JOIN
       CarBMW cb ON cb.carID = ac.CarID

ただし、これは、すべてのタイプを事前に知っている必要があること、および/またはタイプが追加/ドロップ/変更されるたびにクエリを更新する必要があること、および特定のSELECTのテーブル数の制限に達する可能性があることによって明らかに制限されます。非共通属性が複数のサブクラスに出現する可能性がある場合は、その出力列の定義をca.specialAttributeD, cb.specialAttributeD AS specialAttributeDのようなものに変更します。

注:上記はmysqlと互換性があると確信していますが、私は通常、MS SQL Serverフェローであり、テストしていないため、構文を少し調整する必要があります。

1
David Spillett