2012-03-02 9 views
1

私は複数の投稿があるデータベースを持っています。各投稿を1つ以上の場所に関連付けることができます。それぞれの場所は1つの国に関連付けられています。 - 追加された合併症を伴うMySQLと1対多のデー​​タ関係

  • 位置((多くの関係1つを可能にするフィールドpost_idlocation_idと)

    • ポスト(idpost_title有する)
    • postlocation:

      これは4つのテーブルを介して処理されますフィールドがある場合idlocation_titlecountry_id

    • 国(fieldsidcountry_title

    投稿のリスト、それぞれの関連する場所、それぞれの場所の国を取得するために、簡単で効果的な選択を行いたいと思います。

    私はこのことを最大限に達成する方法を失っており、どんな助けでも大歓迎です。ありがとうございました。

  • 答えて

    0

    使用LEFT JOIN

    SELECT post.*, location.*, country.* 
    FROM post 
    LEFT JOIN postlocation ON post.id = postlocation.post_id 
    LEFT JOIN location ON postlocation.location_id = location.id 
    LEFT JOIN country ON location.country_id = country.id 
    

    ここでLEFTが作品に参加する方法の説明です:http://www.mysqltutorial.org/mysql-left-join.aspx

    MySQLのLEFTは、JOIN句は次のように動作します。左 テーブルから行が行と一致したときjoin_conditionに基づく右側の表から、 行のコンテンツが出力行として選択されます。左の行に テーブルが一致しない場合、それはまだ出力のために選択されていますが、 と組み合わせると、すべての列にNULLを含む右側のテーブルの「偽の」行が表示されます。 要するに、MySQL LEFT JOIN節では、右の テーブルに一致するものがなくても、左のテーブルからすべての行 を選択することができます。

    LEFT JOINが複数ある場合は、それぞれ左側のテーブルと右側のテーブルとして結合しているテーブルまでの累積結果を使用します。

    したがって、上記のクエリは、投稿/場所/国ごとに1つの行を返します。これは、同じpost.*のデータを持つ複数の行が存在する可能性があることを意味しています(それぞれの投稿に関連付けられた各postlocationに1つ)。

    ポストに関連付けられたポストプロビジョニングがない場合、そのポストはまだ結果に表示されます(ただし、ヌル行はlocation.*country.*)。同様に、ロケーションに関連付けられている国がない場合でも、ポスト/ロケーション行は出力に表示されます(ただし、ヌル行はcountry.*)。これはLEFT JOINの利点です。テーブルのすべての行を常に "左"に表示します。

    +0

    これは完璧です - まさに私が何をしていたのですか?手伝ってくれてどうもありがとう。 –

    関連する問題