我要做的是访问表中正确的行,以便返回正确的位置名称,地址等。地址返回正确,但有三个结果而不是一个。这些是我们的各个国际地点。
我的表格没有正确规范化,或者我的查询编写错误。我无法弄清楚哪个。也许两者兼而有之。这是我的表格:
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子句(正确地传递给函数)?这是我的加入类型吗?我尝试了左手和外手,这没有帮助。
我做错了什么?
答案 0 :(得分:0)
您的表有一些问题。
大红旗是dealers
有多个具有相同ID的行(这意味着channel_partner_id
不能成为主键)。
这是一个问题,因为看起来dealers_locations
应该是一个交集表。实现此类表的标准方法是获取两个表的主键,在本例中为locations
和dealers
。由于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
的两部分主键。