2012-04-02 12 views
0

私がしようとしているのは、適切な場所名、住所などを返すように、テーブルの適切な行にアクセスすることです。アドレスは正しく返されますが、3つの結果があります1つではなくこれらは私たちの様々な国際的な場所です。適切なクエリまたは適切な正規化:MySQL

テーブルが正規化されていないか、クエリが正しく書かれていません。私はどれを把握することができません。おそらく両方の少し。ここに私のテーブルがあります:

DEALERS TABLE: 

channel_partner_id company 
------------------ -------- 
626     Company Inc. 
626     Company GmBH 
626     Company Ltd. 

DEALERS_LOCATIONS TABLE: 

channel_partner_id location_id 
------------------ ----------- 
626     18 
626     19 
626     20 

LOCATIONS TABLE: 

location_id   address    name_url 
----------   -------------------- ------- 
18     1234 Anywhere St.  anywhere-st 
19     3245 Nowhere St.  nowhere-st 
20     90 Everywhere St.  everywhere-st 

私はそれらをname_urlに参加させたいと思います。

だからここに(簡単に十分な標準のMySQLに翻訳された)CodeIgniterの/ Active Recordの中の私のクエリです:

$this->db->where('l.name_url', $name_url); 
$this->db->join('all_dealers_locations dl', 'dl.channel_partner_id = d.channel_partner_id', 'inner'); 
$this->db->join('all_locations l', 'l.location_id = dl.location_id', 'inner'); 
$row = $this->db->get('all_dealers d')->row(); 

しかし、私はこれから戻って3つの結果を得ることができます。なぜ、関数に正しく渡されているname_urlのwhere節を使用しているのですか?それは私が持っている結合のタイプですか?私は左と外側を試みたが、それは助けにはならなかった。

私は間違っていますか?

+1

この例のデータでは、3つのディーラーのすべてが同じパートナーIDを持ち、すべての3つのロケーションにマッピングされています。だから、あなたが参加している場所に関係なく、3つのディーラー= 3行すべてが得られます。 –

+0

私は知っていますが、私もすべての場所のクエリを行うことができる必要がありますか?彼らがユニークなIDを持っているなら、どのように私は与えられたチャネルパートナーのすべての場所を得るのですか? – sehummel

+0

あなたは「name_urlに参加したい」と言っていますが、あなたの質問はそうではないようです。 ??? –

答えて

0

テーブルにはいくつか問題があります。

大きな赤いフラグは、dealersに同じIDの複数の行があることです(つまり、channel_partner_idはプライマリキーにはなりません)。

dealers_locationsが交差テーブルであると思われるため、これは問題です。このようなテーブルを実装する標準的な方法は、この場合はlocationsdealersの2つのテーブルの主キーを取得することです。 dealer_locationsはプライマリキーがdealersでないため、動作しません。

create table dealers (
    channel_partner_id int primary key, 
    name     varchar(30) 
); 

create table locations (
    location_id int primary key, 
    address  varchar(30), 
    name_url  varchar(30) 
); 

create table dealer_locations (
    location_id int, 
    foreign key (location_id) references locations(location_id), 
    channel_partner_id int, 
    foreign key (channel_partner_id) references dealers(channel_partner_id), 
    primary key (location_id, channel_partner_id) 
); 

dealer_locationsのための2つの部分から主キーを注意:ここでは

は、私が代わりにこれを実装してみましょう。

+0

ありがとう、マット。これは素晴らしい。 – sehummel