问题重现
首先,我们创建三张表
CREATE TABLE `t_comment` (
`c_id` varchar(32) NOT NULL COMMENT '主键',
`c_text` varchar(255) NOT NULL COMMENT '帖子内容',
`c_creator_id` varchar(32) NOT NULL COMMENT '发帖人ID',
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='帖子'
CREATE TABLE `t_sys_user` (
`c_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
`c_name` varchar(50) NOT NULL COMMENT '姓名',
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='管理员'
t_comment 表的数据如下:
c_id | c_text | c_creator_id |
---|---|---|
7c495c6c469111eb931e1c3947c61214 | adafd | 243cec7e469011eb931e1c3947c61214 |
81df2d88469111eb931e1c3947c61214 | afd撒打发士大夫 | 38c0e5bd469011eb931e1c3947c61214 |
85e53c61469111eb931e1c3947c61214 | asdfsdaf234234 | 3ca73c25469011eb931e1c3947c61214 |
997ce539469111eb931e1c3947c61214 | sadfasdf23424332432 | 2953214f469011eb931e1c3947c61214 |
997ce550469111eb931e1c3947c61214 | 啊啊啊 | 2953214f469011eb931e1c3947c61214 |
997ce55a469111eb931e1c3947c61214 | 阿斯顿发顺丰大是大非34234 | 2d2546f4469211eb931e1c3947c61214 |
b89b7915469111eb931e1c3947c61214 | 管理员内容01 | 1 |
b89b791b469111eb931e1c3947c61214 | 管理员内容02 | 2 |
t_sys_user 表的数据如下:
c_id | c_name |
---|---|
1 | 管理员一 |
2 | 管理员二 |
3 | 管理员三 |
t_comment 的 c_creator_id 是字符串,而 t_sys_user 表的 c_id 是数字,如果直接进行 INNER JOIN ,结果会出现错误,比如执行如下SQL语句:
SELECT
c.`c_id`, c.`c_text`, su.`c_name`
FROM t_comment c INNER JOIN t_sys_user su
ON c.`c_creator_id` = su.`c_id`;
返回结果如下:
c_id | c_text | c_name |
---|---|---|
85e53c61469111eb931e1c3947c61214 | asdfsdaf234234 | 管理员三 |
997ce55a469111eb931e1c3947c61214 | 阿斯顿发顺丰大是大非34234 | 管理员二 |
b89b7915469111eb931e1c3947c61214 | 管理员内容01 | 管理员一 |
b89b791b469111eb931e1c3947c61214 | 管理员内容02 | 管理员二 |
显然,返回结果中只有最后两行才是正确的,第一、二行完全不对。
解决方案
解决方案就是让两个字段类型统一。一共有两个方案来写 SQL。
第一种:
SELECT
c.`c_id`, c.`c_text`, su.`c_name`
FROM t_comment c INNER JOIN t_sys_user su
ON c.`c_creator_id` = CONCAT('',su.`c_id`)
这是利用 CONCAT 函数,在字符串和数字拼接的时候,自动把返回结果转换为字符串。
第二种:
SELECT
c.`c_id`, c.`c_text`, su.`c_name`
FROM t_comment c INNER JOIN t_sys_user su
ON c.`c_creator_id` = CAST(su.`c_id` AS CHAR);
这是利用 CAST 函数把数字转换成字符串。