Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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_Join_Associative Table - Fatal编程技术网

使用MYSQL关联表和连接

使用MYSQL关联表和连接,mysql,join,associative-table,Mysql,Join,Associative Table,以下是三个表的结构: CREATE TABLE `contacts` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(99) DEFAULT NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; CREATE TABLE `addresses` ( `id` int(11) unsign

以下是三个表的结构:

CREATE TABLE `contacts` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(99) DEFAULT NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

CREATE TABLE `addresses` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `street` varchar(99) DEFAULT NOT NULL,
  `city` varchar(99) DEFAULT NOT NULL,
  `state` varchar(20) DEFAULT NOT NULL,
  `zip` int(9) DEFAULT NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

CREATE TABLE `contacts_addresses` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `idcontact` int(9) DEFAULT NOT NULL,
  `idaddress` int(9) DEFAULT NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
样本数据:

mysql> select * from contacts;
+----+----------------+
| id | name           |
+----+----------------+
|  1 | hank kingsley  |
|  2 | phil collins   |
|  3 | sam weisgamgee |
|  4 | john johnson   |
|  5 | dale girdley   |
+----+----------------+

mysql> SELECT * FROM addresses;
+----+--------------------+-----------+-------+-------+
| id | street             | city      | state | zip   |
+----+--------------------+-----------+-------+-------+
|  1 | rainbow lane       | fairytown | VT    | 52689 |
|  2 | townie ave         | manhattan | NY    | 98569 |
|  3 | sayitain'tso drive | oldsville | KY    | 25689 |
|  4 | somehow circle     | Anytown   | TX    | 84757 |
+----+--------------------+-----------+-------+-------+

mysql> select * from contacts_addresses;
+----+-----------+-----------+
| id | idcontact | idaddress |
+----+-----------+-----------+
|  1 |         3 |         1 |
|  2 |         3 |         2 |
|  3 |         5 |         3 |
|  4 |         1 |         1 |
|  5 |         4 |         2 |
+----+-----------+-----------+
我正在尝试运行一个查询,该查询将允许我指定一个唯一联系人的id,并提取他们的关联地址。几天来我一直在想这个问题,但我就是不明白联接是如何工作的。其他论坛、文章、材料都没有帮助我阐明这个问题

我的表格结构正确吗?我应该在什么地方用外键吗?我是否对关联表/列使用了适当的命名约定


感谢您提供的任何帮助,无论是解决方案还是显示查询结构的伪代码,谢谢。

您的数据结构是正确的,在地址表和联系人表之间使用映射表是一种很好的方法。我唯一的意见是,
contact\u id
address\u id
可能是比
idcontact
idaddress
更合适的列名,但这取决于您,它的工作方式很好

可以使用联接来实现这种关系。Left join将返回contact,即使它与任何其他表记录都不匹配,或者您也可以使用内部联接,仅当它在每个表中找到匹配项时才返回它

SELECT
    C.*,
    A.*
FROM contacts C
LEFT JOIN contacts_addresses CA
    ON CA.idcontact = C.id
LEFT JOIN address A
    ON CA.idaddress = A.id

您的数据结构是正确的,在地址表和联系人表之间使用映射表是一种很好的方法。我唯一的意见是,
contact\u id
address\u id
可能是比
idcontact
idaddress
更合适的列名,但这取决于您,它的工作方式很好

可以使用联接来实现这种关系。Left join将返回contact,即使它与任何其他表记录都不匹配,或者您也可以使用内部联接,仅当它在每个表中找到匹配项时才返回它

SELECT
    C.*,
    A.*
FROM contacts C
LEFT JOIN contacts_addresses CA
    ON CA.idcontact = C.id
LEFT JOIN address A
    ON CA.idaddress = A.id


又是一个例子。看来两个人是室友

select a.name, c.street, c.city, c.state, c.zip
from contacts a
join contacts_addresses b on a.id = b.idcontact
join addresses c on b.idaddress = c.id;

又是一个例子。看来两个人是室友

select a.name, c.street, c.city, c.state, c.zip
from contacts a
join contacts_addresses b on a.id = b.idcontact
join addresses c on b.idaddress = c.id;

要获取某个特定联系人的所有地址,请说concatid 3,您可以做如下操作

select 
c.id,
c.name,
a.street,
a.city,
a.zip,
a.state
from contacts_addresses ca
join contacts c on c.id = ca.idcontact
join addresses a on a.id = ca.idaddress
where c.id = 3 

要获取所有联系人的地址,只需删除最后一个where条件`

即可获取一个特定联系人的所有地址,如concatid 3,您可以按以下方式执行操作

select 
c.id,
c.name,
a.street,
a.city,
a.zip,
a.state
from contacts_addresses ca
join contacts c on c.id = ca.idcontact
join addresses a on a.id = ca.idaddress
where c.id = 3 

要获取所有联系人,只需删除最后一个where条件`

,您需要使用内部连接来解决问题, 对此的适当查询将是

SELECT con.name, addr.street, addr.state, addr.zip
from contacts_addresses
inner join contacts con
on con.id = contacts_addresses.idcontact
inner join addresses addr
on addr.id = contacts_addresses.idaddress 

您需要使用内部连接来解决您的问题, 对此的适当查询将是

SELECT con.name, addr.street, addr.state, addr.zip
from contacts_addresses
inner join contacts con
on con.id = contacts_addresses.idcontact
inner join addresses addr
on addr.id = contacts_addresses.idaddress 

该语法似乎不起作用,我也无法将其修改为工作状态:
从联系人中选择c.id、c.name、a.street、a.city、a.zip、a.state\u地址作为ca-join联系人作为c-on-c.id=ca.idcontact-join地址作为a-on-a.id=ca.idaddress我之前的查询尝试中有一大堆噪音,我的bad.syntax错误?你能展示一下显示语法错误的查询吗,我想c.id={some concat id}
这只是一个实际的例子,应该说是针对联系人id 2
,其中c.id=2
这一个非常适合我所要做的,谢谢。我做了一些细微的修改:
选择c.name作为联系人姓名,CONCAT(a.street,,,a.city,,,,,a.zip,,,a.state)作为联系人的完整地址,c.id=ca.contact\u id加入联系人c,c.id=ca.id=ca.address\u id,其中c.id=3
该语法似乎不起作用,我也无法将其修改为工作状态:
从联系人中选择c.id、c.name、a.street、a.city、a.zip、a.state_addresses as ca join contacts as c on c.id=ca.idcontact join addresses as a on a.id=ca.idaddress我之前的查询尝试中有一大堆噪音,我的bad.syntax错误?你能展示一下显示语法错误的查询吗,我想c.id={some concat id}
这只是一个实际的例子,应该说是针对联系人id 2
,其中c.id=2
这一个非常适合我所要做的,谢谢。我做了一些细微的修改:
选择c.name作为联系人姓名,CONCAT(a.street,,,a.city,,,,,a.zip,,,a.state)作为联系人的完整地址,c.id=ca.contact\u id加入联系人c,c.id=ca.id=ca.address\u id,其中c.id=3正确,即使联系人之间共享地址,我也希望能够处理数据。正在尝试您的查询。正确,即使联系人之间共享地址,我也希望能够处理数据。现在正在尝试查询。同意的联系人\u id-地址\u id更直观。关于我的加入类型注释,您可以将联系人\u地址内部加入到地址,因为这应该在地址记录之后创建,并且应该始终匹配,您可以从contacts加入contacts\u地址,因为联系人可能并不总是有地址。商定的contact\u id-address\u id更直观。关于我的加入类型注释,您可以将contacts\u地址内部加入到地址,因为这应该在addresses记录之后创建,并且应该始终匹配,您可以从contacts加入contacts\u地址,因为联系人可能并不总是有地址。谢谢!我知道JSFiddle,但从未见过sqlfiddle谢谢!我知道JSFIDLE,但从未见过SQLFIDLE