即使应该,MySQL join也不会返回结果

时间:2014-10-17 21:02:44

标签: mysql sql join

我有一个看似直截了当的问题。我将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;

我知道为什么我没有从加入中获得任何结果?

1 个答案:

答案 0 :(得分:2)

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

以下小提琴显示了一些测试: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)都会对性能产生影响。