我创建了一个测试数据库,因为我需要切换到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链接它们)。奇怪的是昨天工作正常。所以我决定删除测试表并重新开始,但同样的事情。
任何人都有任何想法发生了什么?
答案 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)
您想加入users
和user_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'