InnoDB返回奇怪的结果?

时间:2011-04-23 20:48:26

标签: mysql innodb inner-join foreign-key-relationship

我创建了一个测试数据库,因为我需要切换到InnoDB,因为我需要使用外键和事务。

我出于某种原因在phpMyAdmin中测试查询时得到的结果不正确。

我有一个用户表, uid 是主要/唯一(自动增量), user_profiles 表有 uid ,它是primary / unique,是users表中用户uid的外键,基本上链接到两个表中的uid列。

为了便于理解,这里有两个表:

CREATE TABLE `users` (
`uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`status` char(10) NOT NULL DEFAULT 'verify',
`username` varchar(15) NOT NULL,
`email` varchar(50) NOT NULL,
`password` char(32) NOT NULL,
`reg_date` int(11) NOT NULL,
`ip` varchar(39) DEFAULT NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

CREATE TABLE `user_profiles` (
`uid` int(10) unsigned NOT NULL,
`first_name` varchar(40) DEFAULT NULL,
`last_name` varchar(50) DEFAULT NULL,
`gender` char(6) DEFAULT NULL,
`website` varchar(100) DEFAULT NULL,
`msn` varchar(60) DEFAULT NULL,
`aim` varchar(60) DEFAULT NULL,
`yim` varchar(60) DEFAULT NULL,
`twitter` varchar(15) DEFAULT NULL,
PRIMARY KEY (`uid`),
CONSTRAINT `user_profiles_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

基本上我在users表中添加了一些虚拟记录,然后获取了users.uid并在user_profiles中添加了uid以链接两个表之间的虚拟记录。

现在我遇到的问题很奇怪,首先是我在phpMyAdmin中使用的查询:

SELECT * FROM users INNER JOIN user_profiles
ON users.uid = '11'

基本上,查询应该通过uid将它们链接在一起,从而使用户和user_profiles表中的一个虚拟记录变成我。但奇怪的是它没有。它返回所有记录,即使其他uid是不同的,因为它们是唯一的,即使在查询结果中它表明uid是唯一的并且不相同,没有没有重复项,而且数据库也不会允许它。 / p>

现在我不明白为什么但是它应该只返回1条记录,因为uid是唯一的,并且用户和user_profiles中只有一条记录的uid为11(通过那里的uid链接它们)。奇怪的是昨天工作正常。所以我决定删除测试表并重新开始,但同样的事情。

任何人都有任何想法发生了什么?

3 个答案:

答案 0 :(得分:2)

您没有链接ON上的表格。

你没有提到user_profiles中的任何内容,这就是为什么它需要所有这些内容。

你需要在ON子句中加入连接条件和相等的位置。

查询应为:

SELECT * 
FROM   users 
       INNER JOIN user_profiles 
         ON users.uid = user_profiles.uid 
WHERE  users.uid = '11' 

答案 1 :(得分:2)

您想加入usersuser_profiles的uid,但这不是您所做的,您加入了user_profiles on users.uid = '11'
这当然对user_profiles没有影响,因为您还没有建立用户和user_profiles之间的关系。

变化:

SELECT * FROM users INNER JOIN user_profiles
ON users.uid = '11'

要:

SELECT * FROM users 
INNER JOIN user_profiles ON (users.uid = user_profiles.uid)
WHERE users.uid = '11'

现在你已经说明了用户和他们的个人资料(uid的匹配)之间的关系,而你进一步说明你只想要用户使用uid 11。

答案 2 :(得分:1)

在ON子句中,您必须指定两个表的连接字段,而不是像SELECT * FROM users INNER JOIN user_profiles ON users.uid = user_profiles.uid那样指定过滤条件。 之后,您可以像往常一样添加WHERE子句,例如WHERE users.uid = '11'