Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多列上的相同联接约束_Mysql_Sql_Mariadb - Fatal编程技术网

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查找

考虑应用程序代码中数据显示的处理问题考虑应用程序代码中数据显示的处理问题