Java开发过程(所遇问题+解决方案)

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的执行过程和执行顺序,才能更好的理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Mapy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值