2015-04-15 2 views
1

Как объединить несколько таблиц с помощью MySQL? У меня есть 3 отдельных таблицы.Несколько соединений в MySQL

Проекты

ID Project Name 
1  Big Project #1 

Проекты Контракт Менеджеры

ID Project Id Contract Manager Id 
1  1    11 

Контракт Менеджеры

ID Name 
11 John Smith 
26 Bill Smith 

I хотите присоединиться к 3 таблицам выше, чтобы получить список проектов вместе с именами менеджеров контрактов.

+0

Обратите внимание, что столбец id в «Менеджеры контрактов проектов» не имеет никакой цели. – Strawberry

ответ

2

всего два INNER JOIN s, кажется, достаточно:

SELECT * 
FROM `Projects Contract Managers` pcm 
JOIN `Contract Managers` cm ON pcm.`Contract Manager Id` = cm.`ID` 
JOIN `Projects` p ON pcm.`Project Id` = p.`ID` 
0

Другой Possiblity из первых предложил я всегда чувствую себя лучше читает. Я думаю, что двигатель будет оптимизирован для одного и того же плана выполнения. Вы хотите подтвердить EXPLAIN, если таблицы большие, и вы беспокоитесь о производительности.

SELECT * 
FROM `Projects Contract Managers` a, 
    `Contract Managers` b, 
    `Projects` c 
WHERE a.`Contract Manager Id` = b.`ID` 
     a.`Project Id` = c.`ID` 
+1

Я не согласен. Я не думаю, что SO должно способствовать использованию архаичного синтаксиса. – Strawberry

+0

@ Strawberry Archaic ??? Как так .... – gbtimmon

+1

Перед тем, как у нас были JOINs, у нас были запятые – Strawberry

0

Основываясь на том, что у вас есть, я полагаю, что проекты могут иметь более одного подрядчика и подрядчиков может быть частью более чем одного проекта, имея это в виду, вот MySQL код для создания таблиц:

CREATE TABLE `projects` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `project` VARCHAR(60) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 

CREATE TABLE `contractors` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(60) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 

CREATE TABLE `project_contractors` (
    `pid` INT(11) DEFAULT NULL, 
    `cid` INT(11) DEFAULT NULL 
) ENGINE=INNODB DEFAULT CHARSET=latin1 

Вот запрос с джойн вернуть все записи:

SELECT * 
FROM projects AS p 
JOIN project_contractors AS pc 
ON p.id = pc.pid 
JOIN contractors AS c 
ON pc.cid = c.id; 

вы, возможно, потребуется добавить некоторые пункты, где и порядок по, если вы хотите, но если вы хотите, чтобы вернуть все, что Виль Я делаю это.

Вот некоторые для project_contractors таблицы:

pid cid 
1 2 
1 1 
2 3 
3 4 

за столом подрядчиков:

id NAME 
1 john 
2 mike 
3 dave 
4 steve 

для таблицы проектов:

id project 
1 FIRST project 
2 SECOND project 
3 third project 

и результат запроса:

id project pid cid id NAME 
1 FIRST project 1 2 2 mike 
1 FIRST project 1 1 1 john 
2 SECOND project 2 3 3 dave 
3 third project 3 4 4 steve 

Я думаю, что это будет охватывать то, что вы искали, удачи!

+0

вы серьезно? – potashin

+0

Что случилось с тем, что я разместил? –

+0

Я просто использовал текущие таблицы, которые у него были, и написал запрос для него, вот что он просил. –