2016-04-08 19 views
0

私は、部門、地区、police_stationsテーブルのデータ用に3つのテーブルを持っています。テーブルデータはMySql - 3つのテーブルのデータを1つのテーブルに結合する

divisions 
    id 
    name 

districts 
    id 
    division_id 
    name 

police_stations 
    id 
    division_id 
    district_id 
    name 

が、私は私のテーブルのすべての現在のテーブルの依存関係を持つデータでただ一つのテーブルを設計することができている

divisions 
- districts 
-- police_stations 

表形式のように依存していますか?もしできれば、どのように横断するのでしょうか?

答えて

0

がうまくいけば、それはあなたが結合を使用する必要があり、一緒にグループの複数のテーブルにあなたの問題

SELECT * from divisions d 
      join police_stations ps on d.id=ps.division_id 
      join districts dist on ps.district_id =dist.id; 
+0

ご回答ありがとうございます。私はクエリについて質問していない、@リチャードハミルトンのコメントセクションで私の期待を見てください –

1

解決します。これは、新しいテーブルを作成するよりも優れたデータベース方法です。

INNER JOINキーワードは、両方のテーブルの列が一致する限り、両方のテーブルのすべての行を選択します。

SELECT * 
FROM divisions divis 
INNER JOIN districts dis 
ON dis.division_id = divis.id 
INNER JOIN police_stations pol 
ON pol.district_id = dis.id 

注:もしあなたが部門を識別するために、何か他のものを使用する必要がありますので、どうやらDIVキーワードは、MySQLで予約されています。

このデータを使用して新しいテーブルを作成する場合は、CREATE TABLE ASレシピを使用できます。

これを行うには、元のスキーマを変更する必要があります。新しいテーブルには名前が重複することはできません。元のテーブルにはすべて一意の列があるように変更する必要があります。

たとえば、nameは、district_nameになります。ここで

CREATE TABLE combined AS (
    SELECT divis.id, divis.division_name, dis.district_name, pol.police_name 
    FROM divisions divis 
    LEFT JOIN districts dis 
    ON divis.id = dis.division_id 
    LEFT JOIN police_stations pol 
    ON pol.district_id = dis.id 
); 

は、それが

http://sqlfiddle.com/#!9/7ec3b/1/0

これはしかし本当に悪いデータベース設計を実証することであるフィドルです。私の最初の解決策をお勧めします

+0

あなたの迅速な対応のおかげで、私はクエリについて尋ねていない。私は、すべてのデータを持つテーブルを1つだけ設計し、現在の依存関係を持つ特定のデータをどこで得ることができるかを考えたい。 –

+0

私はそのための解決策を追加しました。しかし、これはひどいデータベース設計であることがわかります。結合を使用する方がはるかに好ましいでしょう –

1

単一のテーブルを使用:各行を一意に識別するためのidがあります。 PRIMARY KEYになります。 parent_idは、他のどの行がその「親」であるかを示します(部門は地区の親などです)。

JOINself joinになります。

SELECT ... 
    FROM tbl AS division 
    JOIN tbl AS district ON division.id = district.parent_id 
    JOIN tbl AS station ON district.id = station.parent_id 
    WHERE ... 

SELECTし、適切な「エイリアス」とWHEREの各フィールドを「資格」にしてください。例:division.name

このデザインパターンは、任意の深さのほとんどの「階層構造」に対して機能します。あなたのものはちょうど3レベル深いので、ややシンプルです。

parent_idは、すべての「地区」行について0になることに注意してください。そして、INDEX(parent_id)が有益です。

関連する問題