Правильный запрос или правильная нормализация: MySQL - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь получить доступ к нужной строке в таблице, чтобы она возвращала правильное имя местоположения, адрес и т. Д. Адрес возвращается правильно, но есть три результата, а не один.Это наши различные международные местоположения.

Либо мои таблицы не нормализованы должным образом, либо я неправильно пишу свой запрос.Я не могу понять, какой.Может быть, немного того и другого.Вот мои таблицы:

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

Но я получаю три результата от этого.Почему, если я использую предложение where в name_url (которое правильно передается в функцию)?Это тип соединения у меня есть?Я попробовал левый и внешний, и это не помогло.

Что я делаю не так?

1 Ответ

0 голосов
/ 03 апреля 2012

Ваши таблицы имеют некоторые проблемы.

Большой красный флаг означает, что dealers имеет несколько строк с одинаковым идентификатором (что означает, что 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...