自认为有必要学习的Sql 总结,积累 mybatis

sql会不断累积,总结,记录

总结1.
1.DISTINCT关键字,对单个字段去重如果说对单个字段排重,再根据另外一个排序的话,使用group up 分组在排序
2.查询某个字段的数量时,使用group up 分组 使用 count(1) 统计数量

1.mysql自带函数
INSTR(STR,SUBSTR) 在一个字符串(STR)中搜索指定的字符(SUBSTR),返回发现指定的字符的位置(INDEX);

2.为什么使用count(1)而不使用count(*)?
如果表只有一个字段,count()最快。
count(1)跟count(主键)一样,只扫描主键。count(
*)跟count(非主键)一样,扫描整个表。明显前者更快一些。
若含有where语句,则会优先where中条件索引

2019-8-3
1.查询我浏览的用户
思路分析
1.通过子查询,先查询出当前用户看过的用户
2.然后对 用户id进行分组,并且查询出最大的时间
3.使用 order by 按照时间字段 进行排序

	SELECT
		  X.user_id,
			MAX(X.create_time) create_time
			FROM
		(SELECT
		  r.user_id,
			r.create_time
		FROM
		  book_member_read_log r,
		  book_contact_member m
		WHERE m.`id` = r.`member_id`
		  AND m.`user_id` = #{condition.userId}
			AND r.`user_id` != #{condition.userId}) X
			GROUP BY X.user_id
			ORDER BY X.create_time DESC

2.根据用户的产品id 查询其他用户是大腕并且产品id 相符合

思路分析
1.查询当前用户,单独取出并放入 list集合
2.mybatis 使用foreach 进行遍历
3.循环所有用户,在sql层判断 其他用户的某个字段 是否包含传入的字段 使用instr内置函数

INSTR(STR,SUBSTR) 在一个字符串(STR)中搜索指定的字符(SUBSTR),返回发现指定的字符的位置(INDEX);
.size在sql中还可以判断list的长度

	SELECT DISTINCT
			*
		FROM
			book_contact_member
		WHERE
		<if test="condition.goodsClassList != null and condition.goodsClassList.size != 0">
		   and 
			<foreach collection="condition.goodsClassList" index="index" item="item" open="(" separator="or" close=")">
				INSTR( goods_class, #{item} ) > 0
			</foreach>
		</if>
		AND user_id != #{condition.userId}
		AND is_famous = 1

3.查询数据,-》 我的引荐-》通过我的userid 查询 我推荐过谁
思路分析
1.查询出我看过的所有人
2.排除 查看的是否是自己
返回结果memberId memberId是另外一张表的ID 所以两表关联查询

SELECT
		 r.member_id,
		 r.create_time
		FROM
		  book_visit_card_recommand r,
		  book_visit_card c 
		WHERE r.member_id = c.member_id 
			AND c.user_id != #{condition.userId}
			AND r.user_id = #{condition.userId}
		GROUP BY r.member_id
		order by r.id desc

在这里插入图片描述在这里插入图片描述
4.联合查询 UNION , 两张表的 相通数据,关联之后, 按照时间排序

	SELECT DISTINCT
		  x.*
		FROM
		  (SELECT
		    *
		  FROM
		    book_contact
		  WHERE user_id =  #{condition.userId}
		    AND contact_status = '0'
		  UNION
		  SELECT
		    c.*
		  FROM
		    book_contact c,
		    book_contact_member m
		  WHERE c.id = m.contact_id
		    AND m.user_id =  #{condition.userId}) X
		ORDER BY x.create_time DESC
  1. 联合查询 根据一个表中的 同一个字段的不同值,分别查出数据 合并 按照时间排序
SELECT 
  x.* 
FROM
  (SELECT 
    n.* 
  FROM
    book_system_news n,
    book_contact c 
  WHERE n.`contact_id` = c.`id` 
    AND c.`user_id` = 'e9322b305ebd45d98adc1643aeece2e8' 
    AND news_type IN ('checkContact', 'seachContact') 
  UNION
  SELECT 
    n.* 
  FROM
    book_system_news n,
    book_contact_member m 
  WHERE n.`member_id` = m.`id` 
    AND m.`user_id` = 'e9322b305ebd45d98adc1643aeece2e8' 
    AND news_type IN ('userContact')) X
ORDER BY x.create_time DESC 

在这里插入图片描述
6.数据库的字段 是 访问量 ,每次网页被访问 数量+1 ,自增长

<update id="updateOfferValue" parameterType="java.lang.String">
		update book_contact_member
		SET
		  offer_value = (offer_value + 1)
		WHERE id = #{id}
	</update>

//2020.5.23更新
7.根据记录表查询的数据记录基础表 主要学习 case用法

 SELECT a.id,a.create_time,a.task_type,a.task_code,a.key_task,a.key_work,a.work_content,a.lead_depart_id,a.lead_depart,a.legal_duty_ids,a.legal_duty,a.current_stage,a.stage,b.task_status 
 FROM
	dt_task_base a,
	(
	SELECT
		t1.task_id,
		case when t2.task_status IS NULL then 0  else 1 end  as task_status 
		-- t2.task_status 
	FROM
		( SELECT task_id FROM dt_task_record WHERE response_companyid = '8a81e781720cbb8901720cbd79610013' GROUP BY task_id ) t1
		LEFT JOIN ( SELECT task_id, 1 task_status FROM dt_task_record WHERE issue_companyid = '8a81e781720cbb8901720cbd79610013' GROUP BY task_id ) t2 ON t1.task_id = t2.task_id 
	) b 
WHERE
	a.id = b.task_id and a.task_type ='1' limit 0, 20
	

//2020.5.28 多条件搜索
重点学习 多个对象like

Sql: select count(*) from dt_task_base where (key_task like '%sss%' or task_code like '%sss%' or lead_depart like '%sss%' or legal_duty like '%sss%' or key_work like '%sss%' or work_content like '%sss%') and task_type = ?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值