dyc_dyc 2020-12-09 16:21 采纳率: 0%
浏览 292
已结题

同样的sql在mybatis查询和mysql查询结果不同,求解。

mapper中代码

select
			AA.fileID,
			AA.file_address,
			AA.uploader,
			AA.upload_time,
			AA.parent_module,
			AA.submodule,
			AA.file_name
		from (
			select if (@pa=f.fileID,@rank:=@rank+1,@rank:=1) rank,
				@pa:=f.fileID as fileID,
				f.file_address,
				f.uploader,
				f.upload_time,
				f.parent_module,
				f.submodule,
				f.file_name
			 from (
				select
					fileID,
					file_address,
					uploader,
					upload_time,
					parent_module,
					submodule,
					file_name
				from files 
					<where>
						<if test="parent_module != '' and parent_module != null">parent_module = #{parent_module}</if>
						<if test="fileID != '' and fileID != null ">AND fileID = #{fileID}</if>
						<if test="submodule != '' and submodule != null ">AND submodule = #{submodule}</if>
					</where>  
					order by fileID asc, upload_time desc
				) f,
				(select @rank:=0,@pa='') tt
			) AA
			where AA.rank=1
		order by AA.fileID

mysql中代码

select
			AA.ID,
			AA.fileID,
			AA.file_address,
			AA.uploader,
			AA.upload_time,
			AA.parent_module,
			AA.submodule,
			AA.file_name,
			AA.ps_log_id,
			AA.blueprint_category
		from (
			select if (@pa=f.fileID,@rank:=@rank+1,@rank:=1) rank,
				@pa:=f.fileID as fileID,
				f.ID,
				f.file_address,
				f.uploader,
				f.upload_time,
				f.parent_module,
				f.submodule,
				f.file_name,
				f.ps_log_id,
				f.blueprint_category
			 from (
				select
					ID,
					fileID,
					file_address,
					uploader,
					upload_time,
					parent_module,
					submodule,
					file_name,
					ps_log_id,
					blueprint_category
				from files 
					WHERE parent_module = '产品中心'
					AND submodule='外部文档'
					AND fileID='PJ002'
					order by fileID asc, upload_time desc
				) f,
				(select @rank:=0,@pa='') tt
			) AA
			where AA.rank=1
		order by AA.fileID

然后前者不能实现按fileID分组后取第一个,后者能实现分组取第一个,别问我为啥不用group by,服务器的mysql的sql_mode属性值无法去掉only_full_group_by,怎么修改配置文件都没用,只能写这么麻烦的sql,但转换到mapper文件里效果就不行了

  • 写回答

3条回答 默认 最新

  • dyc_dyc 2020-12-09 17:26
    关注

    追加,我打印出来的mybatis的的代码和sql的是一样的处理入参的值为?

    select 
    AA.fileID, 
    AA.file_address, 
    AA.uploader, 
    AA.upload_time, 
    AA.parent_module, 
    AA.submodule, 
    AA.file_name 
    from ( 
    select if (@pa=f.fileID,@rank:=@rank+1,@rank:=1) rank, 
    @pa:=f.fileID as fileID, 
    f.file_address, 
    f.uploader, 
    f.upload_time, 
    f.parent_module, 
    f.submodule, 
    f.file_name 
    from ( 
    select fileID, 
    file_address, 
    uploader, 
    upload_time, 
    parent_module, 
    submodule, 
    file_name 
    from files 
    WHERE parent_module = ? 
    AND fileID = ? 
    AND submodule = ?
    order by 
    fileID asc, 
    upload_time desc 
    ) f, 
    (select @rank:=0,@pa='') tt 
    ) 
    AA where AA.rank=1 
    order by AA.fileID 

    且,我在mysql中测试时发现,新建查询时,第一次执行,所以的rank列的值都是1,第二次执行时就能正确编号,怀疑第一次执行时

    select if (@pa=f.fileID,@rank:=@rank+1,@rank:=1) rank,

    这句代码的if判定结果都是走的false,但为啥会这样就没想明白,求大佬解惑

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月26日