Mysql 多列上的相同联接约束
我们有一个情况,我已经能够通过以下简单的例子重现。我有以下两个示例表:Mysql 多列上的相同联接约束,mysql,sql,mariadb,Mysql,Sql,Mariadb,我们有一个情况,我已经能够通过以下简单的例子重现。我有以下两个示例表: CREATE TABLE contact_info ( id INT UNSIGNED AUTO_INCREMENT, priContactId INT, secContactId INT, blahBlah VARCHAR(32), PRIMARY KEY(id) ); 及 我将其填充如下: INSERT INTO contact_info(priContactId, secContactI
CREATE TABLE contact_info
(
id INT UNSIGNED AUTO_INCREMENT,
priContactId INT,
secContactId INT,
blahBlah VARCHAR(32),
PRIMARY KEY(id)
);
及
我将其填充如下:
INSERT INTO contact_info(priContactId, secContactId, blahBlah) VALUES(1, 3, "Team A"), (4, 2, "Team B");
INSERT INTO name_lookup(contactID, contactName) VALUES(1, "John Doe"), (2, "Mary Smith"), (3, "Jose Garcia"), (4, "Larry Brown");
+----+--------------+--------------+----------+
| id | priContactId | secContactId | blahBlah |
+----+--------------+--------------+----------+
| 1 | 1 | 3 | Team A |
| 2 | 4 | 2 | Team B |
+----+--------------+--------------+----------+
+----+-----------+-------------+
| id | contactID | contactName |
+----+-----------+-------------+
| 1 | 1 | John Doe |
| 2 | 2 | Mary Smith |
| 3 | 3 | Jose Garcia |
| 4 | 4 | Larry Brown |
+----+-----------+-------------+
显然,这些表格的内容如下:
INSERT INTO contact_info(priContactId, secContactId, blahBlah) VALUES(1, 3, "Team A"), (4, 2, "Team B");
INSERT INTO name_lookup(contactID, contactName) VALUES(1, "John Doe"), (2, "Mary Smith"), (3, "Jose Garcia"), (4, "Larry Brown");
+----+--------------+--------------+----------+
| id | priContactId | secContactId | blahBlah |
+----+--------------+--------------+----------+
| 1 | 1 | 3 | Team A |
| 2 | 4 | 2 | Team B |
+----+--------------+--------------+----------+
+----+-----------+-------------+
| id | contactID | contactName |
+----+-----------+-------------+
| 1 | 1 | John Doe |
| 2 | 2 | Mary Smith |
| 3 | 3 | Jose Garcia |
| 4 | 4 | Larry Brown |
+----+-----------+-------------+
我们希望执行联接操作,以便获得如下输出:
+-------------+-------------+--------+
| John Doe | Jose Garcia | Team A |
+-------------+-------------+--------+
| Larry Brown | Mary Smith | Team B |
+-------------+-------------+--------+
priContactId
和secContactId
列的连接约束是相同的,我很难弄清楚连接查询应该是什么样子
仅供参考,我们使用的是MySQL版本5.6.49
两个单独的列需要两个单独的表副本联接
两个单独的列需要两个单独的表副本联接
这通常通过两个连接来处理。您对这两个联系人没有
notnull
约束,因此我建议使用外部联接:
select nl_pri.contactName as PrimaryName, nl_sec.contactName as SecondaryName,
ci.blahblah
from contact_info ci left join
name_lookup nl_pri
on ci.priContactId = nl_pri.contactId left join
name_lookup nl_sec
on c.secContactId = nl_sec.contactId;
注:
保留所有联系人,即使是主联系人和次联系人都没有的联系人left join
- 表别名使查询更易于编写和读取。表别名应该是有意义的
- 您应该定义外键关系,这样很明显联系人ID引用的是
表name\u查找
notnull
约束,因此我建议使用外部联接:
select nl_pri.contactName as PrimaryName, nl_sec.contactName as SecondaryName,
ci.blahblah
from contact_info ci left join
name_lookup nl_pri
on ci.priContactId = nl_pri.contactId left join
name_lookup nl_sec
on c.secContactId = nl_sec.contactId;
注:
保留所有联系人,即使是主联系人和次联系人都没有的联系人left join
- 表别名使查询更易于编写和读取。表别名应该是有意义的
- 您应该定义外键关系,这样很明显联系人ID引用的是
表name\u查找