2012-02-17 19 views
1

解決策が見つかりませんでしたので、お聞きしたいと思います。MySQLの2つの異なるケースで3つのテーブルをバインド

私は3つのテーブルを持っていることがすべてです:都市、地区、機関。

  • 地区は、都市

私は機関を登録したいときに今、私は機関が属しているから地区を選択しなければならないと関係を持っていますが、その市がどの地区を持っていない場合は、私は市自体を選ぶ必要があります。だから、問題は、どのように私は与えられた状況のためにこれらのテーブルをバインドできますか?

P.S.地区と都市は、汚いあり

答えて

2

は、2つのテーブルを持って、「機関」と「エリア」

は、「エリア」とはすなわちAREA_ID自体にリンクすることを許可し、

にあなたが常にAREA_IDに研究所をリンクして、内部ロジックこの道をparent_area_idその地区が地区か都市かと判断できます。

あなたが今

institutions (
    id UNSIGNED INT NOT NULL PK AI, 
    area_id UNSIGNED INT NOT NULL, 
    name VARCHAR NOT NULL 
) 

areas (
    id UNSIGNED INT NOT NULL PK AI, 
    parent_area_id UNSIGNED INT NOT NULL DEFAULT 0, 
    name VARCHAR NOT NULL, 
    type ENUM('city','district') NOT NULL DEFAULT 'city' 
) 

を持っているので、areas.typeフィールドはオプションですが、あなたがそのように定義したい場合は、その後の内部ことを行う方法であってもよいことデータベース(それ以外の場合は、parent_area_id = 0なら都市、それ以外は地区)

このようにして、フィールドを選択すると、

SELECT * 
FROM institutions 
INNER JOIN areas 
ON areas.id = institutions.area_id 

あなたは機関がリンクへのAREA_IDところ、地区や都市のテーブルに行くべきかどうかに対して何ら疑問符がありません100%特定することができ、間違いなく順番に中地区と都市を扱うどの領域テーブルに起こっていますあなたのフロントエンドが都市または地区として解釈できる形式で情報を提示します。あなたが本当にたとえば、常に機関がこのパターンが多形と呼ばれる都市

+0

あなたの答えはもっと近いようですが、誰かが別の良いアイデアを持っているかもしれません:) – Denees

+0

あなたの初期テーブル設定は、汚れた。あなたがそれを丸いペグに変えることができるときに丸い穴にこの正方形のペグを強制しようとするだけで愚かなようです。この問題を複数回、ホテルを地理的エリアに分類して扱ったことがあります。私の提案はちょうどfyiに基づいています。 –

+0

あなたの提案は何ですか? – Denees

2

バインドしたまま、これを行うの汚い方法を繰り返す必要があります:機関を持っているタイプSIGNED INTのIDフィールドを持って、市のIDを指す負の数であり、地区を指し示す正の数。これは、簡単にクエリを結合するためのものです。再び

:これは汚いですが、私はあなたが(例えば、親フィールドを持つ都市と地区のツリー・テーブルを作成することによって)alltogether事態を避けるためお勧めしていますが、モデルを変更することができない場合、これは動作します。

2

内の特定の地区に縛られた場合でも、都市名を返すだろうと

SELECT 
    i.*, 
    COALESCE(a_parent.id,a_child.id) AS city_id, 
    COALESCE(a_parent.name,a_child.name) AS city_name 
FROM institutions AS i 
INNER JOIN areas AS a_child 
ON a_child.id = i.area_id 
LEFT JOIN areas AS a_parent 
ON a_parent.id = a_child.parent_area_id 

したい場合はオプションで、さらに一歩を行くことができますSQLでうまく解決するのは容易ではありません。

uid // common id table with globally unique ids 
    id int AUTO_INCREMENT 

city 
    id UNIQUE FK:uid.id 

district 
    id UNIQUE FK:uid.id 
    city_id FK:city.id 

institution 
    location_id FK:uid.id 

fruits 
    id UNIQUE FK:uid.id 

FKは外部キーを意味します。 institution.location_idは、果物ではなく、地区や都市を指していることを手動で確認する必要があります。

関連する問題