MySQL连接查询没有返回结果,即使应该返回。

3

我有一个看似很简单的问题。我需要将一个id列表与第二个表中的另一个id列表进行匹配。以下查询可以成功地执行并返回结果:

select * from dataTable where id = 3888;
select * from moreIDs where mmid = 3888;

然而,join语句不返回任何结果。

select * from dataTable inner join moreIDs on dataTable.id = moreIDs.mmID;

有什么想法,为什么我的连接没有返回任何结果?

两个变量都声明为varchar(15)。 - Anne
3
我猜测你的varchar中可能有尾随空格或额外字符。例如,在http://www.sqlfiddle.com/#!2/5100d/1中,当我查找id = 3888时,它会返回dataTable中的两个记录,即使第二条记录实际上是'3888 '。 - Brian Hoover
你使用的MySQL服务器版本是哪个? - dognose
我正在使用 MySQL 服务器版本 5.5。 - Anne
谢谢你,布莱恩!我仔细看了一下我的数据文件,似乎你是正确的。 - Anne
显示剩余4条评论
1个回答

2

正如您在评论中所了解的那样,您的问题与数据类型有关。

以下fiddle显示了一些测试:fiddle

首先,我创建了三个表格如下:

CREATE TABLE table1 (id varchar(15));
CREATE TABLE table2 (id varchar(15));
CREATE TABLE table3 (id int);


并插入了一些数据:

INSERT INTO table1 values ('3888');
INSERT INTO table2 values (' 3888 '); -- extra spaces
INSERT INTO table3 values (3888);

如果您使用一个 varchar 列与一个 int 值进行比较,那么 varchar 将被隐式转换为 int 并且多余的空格将被移除。以下示例将返回 3888
SELECT * FROM table1 WHERE id = 3888; 
SELECT * FROM table2 WHERE id = 3888; 


但是如果你在JOIN操作中尝试这个匹配,你将会比较varcharvarchar,所以'3888' = ' 3888 '会被判定为false。

为了解决这个问题, 你可以将其中一个列转换为int(使用强制类型转换), 或者使用TRIM()函数,例如:

SELECT * 
FROM table1
INNER JOIN table2
ON TRIM(table1.id) = TRIM(table2.id);

注意:如果可能的话,将两个列都转换为int以获取SARGABLE查询。如果使用索引,则每行中的强制转换操作(从varcharint)将对性能产生影响。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接