1.在id自增的情况下,插入一条语句的时候,获取最后一个插入的数据的自增id
-
insert into
hm_jc
(colume1,colume2) values(value1,value2);SELECT LAST_INSERT_ID();
在数据库中可以直接返回最后一条插入的id。 -
SELECT LAST_INSERT_ID() from hm_jc;
返回该表中的最后一个插入的id,但是该表中有几条是数据就会返回几条数据。 -
在Mapper.xml中想要听过insert语句返回该条插入语句最后的自增id,可以通过在标签中进行配置,可以用map中的一个key来接收,下面是一个例子,参数通过map传入,然后设置自增idkey为true,并且将自增id赋值给自定义名称,最后这个自定义名称key会被映射到你parameterType中的那个map里,可以直接取值。核心标签useGeneratedKeys和keyProperty。
<insert id="insertMedia" parameterType="hy" useGeneratedKeys="true" keyProperty="id">
insert into `hm_jc`(media,title,type,status,note,create_time) values(#{media},#{title},#{type},#{status},#{note},#{createTime});
</insert>
到这里传入的map里就会存储这个id了,需要的时候只需要map.get(“自定义key”)即可。
2.查询数据库的时候,当你想要查询的某个字段属性有两条属数据,你想要将他合并成一个字符串并返回
可以使用GROUP_CONCAT(字段名,“自定义分隔符”)来实现,例如:
select title from hm_user_view;
这个SQL执行结果是
而我们想要将所有的title合并成一个字段,执行如下SQL
SELECT GROUP_CONCAT( title ) FROM hm_user_view;
执行结果如下:
这样就可以满足需求啦!
3.当我们的数据表中的字段是字符串类型的数字,但我们想要对这些数字进行计算,怎么通过SQL语句实现呢?
这个我们可以使用MySQL中内置的 CAST函数,CAST(a as signed) +CAST(b as signed) 这是一个简单的加法,a和b指的是数据库表中具体的数字型字符串,实际情况中自行替换,signed表示有符号位,如果是无符号位可以用unsigned。
下面举个例子来说明:这是一张表,share字段是字符串类型的,表示分享数。
现在想要求求出总分享数,字段命名为c,可以执行如下SQL
SELECT CAST(( SELECT SHARE FROM hm_user_view WHERE id = 1 ) AS SIGNED ) + CAST(( SELECT SHARE FROM hm_user_view WHERE id = 2 ) AS SIGNED
) AS c;
结果如下图:
这样就实现了数字型字符串的加法运算,其他基本运算以此类推即可。
4.当我们有一个用户,现在关联了一张浏览记录表,每个教程都会对应一个记录,现在要统计这个用户的总浏览量,总浏览时长等信息,应该怎么通过SQL实现呢?
这是一个用户基本信息表
这是该用户对用的两条浏览记录表,其中title表示浏览的教程标题,view_time表示浏览的时长,view_date表示浏览的时间,share表示分享次数,view表示浏览量
可以看到该用户看了两个教程,并且每个教程的浏览量,浏览时长都不同,但是都是该用户看的,现在一个需求就是统计某个用户的总浏览量和总浏览时长,如下图所示:
我们可以通过如下SQL语句来实现:
SELECT DISTINCT USER
.avator,
USER.emcee_name,
USER.phonenumber,(
SELECT
SUM( userView.VIEW )) AS VIEW,(
SELECT
GROUP_CONCAT( userView.title )) AS title,(
SELECT
SUM( userView.view_time )) AS viewTime,(
SELECT
sum( view_time )
FROM
hm_user_view
WHERE
DATE ( view_date ) = CURDATE()) AS viewTimeNowDay,(
SELECT
MAX( userView.view_date )) AS viewDateCurrent,
USER.end_ip_location,(
SELECT
SUM( userView.SHARE )
) AS SHARE,
USER.signView
FROM
hm_emaccount
AS USER JOIN hm_user_view AS userView ON USER.id = userView.user_id
WHERE
userView.view_date >= '2023-06-17 14:00:00'
AND userView.view_date <= '2023-06-19 14:00:00';
这里面需要认真分析SQL的执行过程和执行顺序,才能更好的理解。