【发布时间】:2013-05-13 21:16:24
【问题描述】:
我有两张桌子:
create table t1(
id int unsigned not null auto_increment,
group varchar(3) not null,
number int unsigned zerofill,
used enum('YES','NO') default );
id group number used
1 '110' 00001 'YES'
2 '110' 00002 'YES'
3 '110' 00003 'YES'
4 '210' 00001 'YES'
5 '210' 00002 'YES'
6 '210' 00003 'YES'
7 '310' 00001 'YES'
create table t2(
id int unsigned not null auto_increment,
number varchar(13) default null);
id number
1 '110-00001'
2 '110-00002'
3 '210-00002'
4 '310-00001'
我的第一个目标是找到 t1 中未在 t2 中使用的每条记录:
查询结果:
id group number used
3 '110' 00003 'YES'
4 '210' 00001 'YES'
6 '210' 00003 'YES'
我的第二个目标是将列设置为“否”:
id group number used
3 '110' 00003 'NO'
4 '210' 00001 'NO'
6 '210' 00003 'NO'
我尝试使用这样的查询:
select * from t1
left outer join t2
on t1.number = cast(substring(t2.number,8,5) as int)
where t2.id is null;
但是 mySQL 说:
您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在 'int) 附近,其中 tblpeserta.id 为空
有没有更好的查询来解决我的问题?!
【问题讨论】:
-
不应该是
CAST(SUBSTRING(t2.number,8,5) AS UNSIGNED)吗?实际上,我不太清楚你为什么需要在这里投射。 -
因为 t1 中的数字是 int zerofill 而 t2 中的数字是 varchar,所以我需要将其转换为 int 以便可以比较 t1.number 和 t2.number
标签: mysql join substring outer-join