MySQL中的多个连接

时间:2015-04-15 16:08:57

标签: mysql sql join

如何使用MySQL将多个表连接在一起?我有3个单独的表。

项目

ID    Project Name
1     Big Project #1

项目合同经理

ID    Project Id    Contract Manager Id
1     1             11

合同经理

ID    Name
11    John Smith
26    Bill Smith

我想加入上面的3个表格,以获得项目列表以及合同经理名称。

3 个答案:

答案 0 :(得分:2)

只有两个INNER JOIN似乎就足够了:

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`

答案 1 :(得分:0)

第一个建议的另一个可能性我总觉得读起来更好。我认为引擎会针对相同的执行计划进行优化。您可以使用EXPLAIN确认表是否很大并且您担心性能。

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

答案 2 :(得分: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

以下是使用join返回所有记录的查询:

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

如果您愿意,您可能需要添加一些where子句和order by,但是如果您想要返回所有将执行此操作的内容。

以下是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

我认为这将涵盖你所寻找的东西,祝你好运!