使用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