一个很蛋疼的问题,如下,最后的结果查询不来,非常让人疑惑。
使用过程随机生成数据,我怀疑时类型问题,但是在创建中使用了cast和concat都没用,直接用in (98,91)之类的可以,但是用上子查询就查不出来 了
create table query_test(
stu_id varchar(20) primary key comment "学号",
stu_name varchar(20) comment "姓名",
stu_grade int comment "成绩"
)
delimiter $$
create procedure auto_insert1()
begin
declare i int default 1;
while (i<1000) do
insert into worker.query_test values (i,substr(md5(rand()*100),1,3),rand()*100);
set i=i+1;
end while;
end $$
delimiter ;
call auto_insert1();
select * from query_test where stu_id in
(select group_concat(stu_id) from query_test group by stu_grade having stu_grade =100)
据我从你sql语句中看出,你使用了group_concat这个函数,那么你查到的stu_id会默认以逗号分隔的排列,子查询所得的数据是 ("数据1,数据2,数据3" , "数据4,数据5,数据6") 那么你前面的in只能查询到每行数据的第一个数据——数据1和数据4对应的query_test的信息,不能够将所有的数据都查询到。
如果业务没分组需求的话,建议你改为:
select * from query_test where stu_id in
(select stu_id from query_test where stu_grade =100)
试一试看能不能查到你想要的数据。
可以看一下in与exist区别,可以参考下http://t.csdn.cn/7p2aN
也可以考虑用左连接代替in跟子查询,优化sql
group_concat 是把很多数据按逗号拼接成一个字符串,你再用 stu_id in 肯定in不出来的
group_concat去掉