Php 无法关联两个MySQL表(外键)

Php 无法关联两个MySQL表(外键),php,mysql,Php,Mysql,这是我的USER表 CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(100) NOT NULL, `expiry` varchar(6) NOT NULL, `contact_id` int(11) NOT NULL, `email` varchar(255) NOT NULL, `password` varchar(100) NOT

这是我的
USER

CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(100) NOT NULL, `expiry` varchar(6) NOT NULL, `contact_id` int(11) NOT NULL, `email` varchar(255) NOT NULL, `password` varchar(100) NOT NULL, `level` int(3) NOT NULL, `active` tinyint(4) NOT NULL DEFAULT '1', PRIMARY KEY (`id`,`email`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 如果不存在“用户”,则创建表( `id`int(11)非空自动增量, `用户名`varchar(100)不为空, `expiration`varchar(6)不为空, `联系人id`int(11)不为空, `电子邮件'varchar(255)不为空, `密码'varchar(100)不为空, `级别'int(3)不为空, `活动'tinyint(4)不为空默认值'1', 主键(`id`、`email`) )ENGINE=InnoDB默认字符集=latin1自动增量=1; 这是我的联系方式表

CREATE TABLE IF NOT EXISTS `contact_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `email_address` varchar(255) NOT NULL, `company_name` varchar(255) NOT NULL, `license_number` varchar(255) NOT NULL, `phone` varchar(30) NOT NULL, `fax` varchar(30) NOT NULL, `mobile` varchar(30) NOT NULL, `category` varchar(100) NOT NULL, `country` varchar(20) NOT NULL, `state` varchar(20) NOT NULL, `city` varchar(100) NOT NULL, `postcode` varchar(50) NOT NULL, PRIMARY KEY (`id`,`email_address`), ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 如果不存在“联系人信息”,则创建表( `id`int(11)非空自动增量, `name`varchar(255)不为空, `电子邮件地址'varchar(255)不为空, `公司名称'varchar(255)不为空, `许可证编号'varchar(255)不为空, `电话'varchar(30)不为空, `传真'varchar(30)不为空, `mobile`varchar(30)不为空, `类别'varchar(100)不为空, `country`varchar(20)不为空, `state`varchar(20)不为空, `city`varchar(100)不为空, `邮政编码'varchar(50)不为空, 主键(`id`、`email\u address`), )ENGINE=InnoDB默认字符集=latin1自动增量=1; 系统使用用户名登录用户。我想修改它的方式,它使用电子邮件登录。但用户表中没有电子邮件地址

我在用户表中添加了外键-电子邮件(这是联系人信息中的电子邮件地址)


我该如何查询数据库?

不,不,不,不,不。说真的,不。别逼我过去:-)

您将电子邮件地址存储两次,这打破了第三种正常形式

这种关系只需要很短,即
id
。假设您不保证两个表中的id相同(即,我的
users.id
不一定等于我的
contact\u info.id
),只需在
users
表中添加一个
ci\u id
,作为
contact\u info
表的外键即可

然后,获取用户的
用户名
电子邮件
的查询如下:

select u.username, ci.email
from users u, contact_info ci
where u.username = 'paxdiablo'
and u.ci_id = ci.id;

您真的希望每个用户有两个电子邮件地址吗?或者这是两个表之间的一对多关系?使用ANSI默认值的相同SQL查询:选择u.username,ci.email from users internal join contact\u inf ci on cid.id=u.cid\u id,其中u.username='someone';这两种方法工作得很好,但是当有许多表联接时,更容易知道搜索条件和表联接在哪里。