MySQL几个问题:Column 'XXXX' in where clause is ambiguous,去除重复项,mybatis报错

最近工作西街口,遇到MySQL,Mybatis相关的几个问题,大概讲一下问题发生情况,解决办法和原因。

(一)Column ‘create_time’ in where clause is ambiguous
问题:
这个不管你是在IDEA的控制台看Mybatis报错还是在看Mysql返回来的抱错都能看到这个,“ambiguous”,谷歌翻译第一个结果是暧昧,可以的这报错,6666.
解决:
找到对应的字段位置加上所在表的别名,下面是我改完后参看倒数第五行,我加了个所在表的别名就OK了。

SELECT
        uvr.id,
        uvr.user_id,
        uvr.target_type,
        uvr.target_id,
        uvr.create_time,
        temp.`goods_name`,
        u.head_img_url
        FROM
        user_view_record
        uvr
        INNER JOIN goods temp ON uvr.target_id = temp.id
        LEFT JOIN user_info u ON uvr.user_id = u.id
        WHERE
        target_id = #{goodsId}
        <![CDATA[AND DATE_SUB(CURDATE(), INTERVAL 10 DAY) <= date(uvr.create_time)]]>
        GROUP BY
          user_id
        ORDER BY
          create_time DESC

问题原因:
其实报错说得很清楚,ambiguous这里是含糊不清的意思,问题的根源你产生问题的字段可能A表有B表也有,你要告诉他是要那个表的对应字段,他就不会“暧昧”了。
(二)去重
问题:
这个问题其实很没含量,就是我获得很多数据,对我来说只要一个ID或者用户名就OK了,但是关联数据后或者本身这个表(例如流水表,日志表)就有很多对应的ID重复数据,对你来说这些就是重复的数据
解决:
group by 关键字了解一下,group by 你要处理的字段就可以达到去重的效果。
原因:
如果你是真的去除重复项其实,搜一下很多帖子,但实际工作中不会让你随便删数据的,这都是以后要分析的数据,你删掉以后你怎么分析用户特性。
例子还是上面的SQL,要记得一点就是group by要在order by的前面,否则执行会有问题。还有一点是group by 一对多的情况下也只显示一条一边来说是第一条显示。
(三)mybatis 里面 “小于等于” 或“>=”的匹配
问题:
我们写SQL通常会用到>= 等比较符号,在SQL的图形化工具上执行没问题,但是你放在mybatis里面的mapper文件就不可以了,在程序调试的时候你会发现到这边没有数据取不到或者直接报错。
解决:
用<![CDATA[ 你要用到的SQL语句 ]]>来括起来
原因:
这个是由于XML文档解析引起的,而不是mybatis引起的,这个mapper文件就是一个XML文件他会解析文档,假如您在 XML 文档中放置了一个类似 “<” 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。严格地讲,在 XML 中仅有字符 “<“和”&” 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。但是你SQL要用到小于符号,怎么办呢,这就要用到下面介绍的CDATA这个东西。

这个CDATA你可以在W3Cscholl上看,CDATA 部分中的所有内容都会被XML解析器忽略,所以你直接用CDATA包裹起来,XML解析器就不会管他,然后他就作为SQL的一部分去MySQL进行对应的事务处理。
资料(关于CDATA,里面也有对XML解析出的问题也有解释,只要不是< &)
http://www.w3school.com.cn/xml/xml_cdata.asp

猜你喜欢

转载自blog.csdn.net/FeiChangWuRao/article/details/84638470