mysql select @params:= 的问题

1、创建班级表

create table class
(
    id int primary key auto_increment,
    title varchar(50)
)

2、添加测试数据

insert into class values(null,'小班'),(null,'中班'),(null,'大班')

3、按默认排序查看结果

select * from class

 

 

 4、通过 select @params:= 取一条记录

select @title:=title
from class
limit 1;

select @title;

 

 

 

=> 结果符合预期

 

5、改变默认排序重新查看结果

select * from class order by convert(title using gbk)

 

 

 6、通过 select @params:= 结合自定义排序取一条记录

select @title:=title
from class
order by convert(title using gbk)
limit 1;

select @title;

 

 

 

=> 结果符合预期

 

 7、再添加一张学生表

create table student
(
    id int primary key auto_increment,
    cid int,
    name nvarchar(50)
)

8、添加测试数据

insert into student values(null,1,'刘备'),(null,2,'关羽'),(null,3,'张飞')

9、按默认排序查看关联表结果

select std.*,cls.title
from student std left join class cls on std.cid=cls.id

 

 

 10、通过 select @params:= 取一条记录

select @name:=name
from student std left join class cls on std.cid=cls.id
limit 1;

select @name;

 

 

 

=> 结果符合预期

 

11、改变默认排序重新查看关联表结果

select std.*,cls.title
from student std left join class cls on std.cid=cls.id
order by convert(title using gbk) desc

 

 

 12、通过 select @params:= 结合自定义排序获取关联表的一条记录

select @name:=name
from student std left join class cls on std.cid=cls.id
order by convert(title using gbk) desc
limit 1;

select @name;

 

 

问题出来了!!!

 

如果换其他排序方式,如:

order by cid

order by cid desc

order by convert(name using gbk)

order by convert(name using gbk) desc

order by convert(title using gbk)

这些都没问题。

为什么会出现这个情况呢?我也不知道,暂时还找不到答案,先记录下吧。

 

不过倒是有替代方案:

select name
from student std left join class cls on std.cid=cls.id
order by convert(title using gbk) desc
limit 1
into @name;

select @name;

替代方案只会出现一个查询结果集,总不会导致上面方案的两个结果集不一致的情况。

posted @ 2023-03-17 12:24  laoq112  阅读(68)  评论(0编辑  收藏  举报