正确的查询或正确的规范化:MySQL

时间:2012-04-02 22:55:32

标签: mysql codeigniter

我要做的是访问表中正确的行,以便返回正确的位置名称,地址等。地址返回正确,但有三个结果而不是一个。这些是我们的各个国际地点。

我的表格没有正确规范化,或者我的查询编写错误。我无法弄清楚哪个。也许两者兼而有之。这是我的表格:

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。

所以这是我在CodeIgniter / Active Record中的查询(它很容易被翻译成标准的MySQL):

$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();

但我从中得到了三个结果。为什么,如果我使用name_url的where子句(正确地传递给函数)?这是我的加入类型吗?我尝试了左手和外手,这没有帮助。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的表有一些问题。

大红旗是dealers有多个具有相同ID的行(这意味着channel_partner_id不能成为主键)。

这是一个问题,因为看起来dealers_locations应该是一个交集表。实现此类表的标准方法是获取两个表的主键,在本例中为locationsdealers。由于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的两部分主键。