数据库表简介:物品表

`id` int(11)    '物品id,唯一标识',
`name` varchar(255)   '物品名称',
`level` int(11)   '物品类别等级,礼品包为最高级1,类别为2级,详细物品为3级',
`parentId` int(11)  '只有3级详细物品有上级id',
`childIds` varchar(255)    '只有1级礼品包级有包含所有3级物品id的字符串,id之间用","隔开',

问题描述:利用sql语句简化代码,让Java代码可以直接通过jdbc查询获取下述集合

  1、根据输入的1级的id查询其包含的所有3级物品信息

  2、根据输入的1级的id查询其包含的所有3级物品对应的2级物品类别信息

>>>>>>>>>>>>>>>>>>>>>>>>solution>>>>>>>>>>>>>>>>>>>>>>>>>>>

问题1:因为in(childIds)使用针对字符串不能遍历childIds中所有id,又要避免在Java代码中先获取childIds,再split(",")之后循环获取对应good对象。巧妙利用childIds字段中id用","隔开的特性,所有使用FIND_IN_SET(id,str)函数。

  select g.* from good g where FIND_IN_SET(g.id,(select childIds from good where id =1));    #假设输入1级id为1

查询结果:返回1级下所有3级物品集合

>>>>>>>>>>>>>>>>>>>>>>>>solution>>>>>>>>>>>>>>>>>>>>>>>>>>>

问题2:首先利用问题一种所查信息获取所有的parentId

  select distinct g.parentId from good g where FIND_IN_SET(g.id,(select childIds from good where id =1))

  既然parentId都已经查出来了,按以往办法先获取所有parentId集合,再遍历查询出所有该1级childIds中的3级物品对应的2级物品类别信息。解决办法使用GROUP_CONCAT(id)将所查parentId拼接成"3,4,5"这样的字符串。

先看看GROUP_CONCAT的用法:

select GROUP_CONCAT(L2ids.parentId) from
  (select distinct g.parentId from good g where FIND_IN_SET(g.id,(select childIds from good where id =1))) L2ids

再使用问题1中的解决办法查询所有2级物品信息:

select g.* from good g where FIND_IN_SET(g.id,
  (select GROUP_CONCAT(L2ids.parentId) from
    (select distinct g.parentId from good g where FIND_IN_SET(g.id,(select childIds from good where id =1))) L2ids))

总结:在一般的表格带参数查询的函数中,可以先想想如何利用sql查询出所预期的结果,避免大规模的使用Java代码进行循环遍历。嗯,真香~

MySQL巧用FIND_IN_SET和GROUP_CONCAT函数减少Java代码量的更多相关文章

  1. Java基础学习总结(81)——如何尽可能的减少Java代码中bug

    Java编程语言的人气自然无需质疑,从Web应用到Android应用,这款语言已经被广泛用于开发各类应用及代码中的复杂功能. 不过在编写代码时,bug永远是困扰每一位从业者的头号难题.在今天的文章中, ...

  2. mysql数据库的连接以及增删改查Java代码实现(转载)

    每天叫醒自己的不是闹钟,而是梦想 数据库: create table t1(id int primary key not null auto_increment,name varchar(32),pa ...

  3. MySQL中好用的GROUP_CONCAT函数

    今天看到同事的代码,又学到了一个有用的函数,刚看的时候不太懂,就搜了下用法,看下面这篇文章讲的挺详细就直接转载了,我也写不那么好,呵呵,感谢作者的无私奉献. http://blog.sina.com. ...

  4. MySQL中使用group_concat()函数数据字符过长报错的问题解决方法

    最近在办公软件项目,在开发权限指标遇到一个问题:我们系统的一些逻辑处理是用存储过程实现的,但是有一天客户反馈说权限指标分配报错,查了分配的权限数据牵扯到的数据权限基础资源,没有问题.权限指标分配的存储 ...

  5. MySQL中使用group_concat()函数数据被截取(有默认长度限制),谨慎!

    最近在工作中遇到一个问题: 我们系统的一些逻辑处理是用存储过程实现的,但是有一天客服反馈说订单下单失败,查了下单牵扯到的产品基础资源,没有问题. 下单的存储过程中有这样两句代码: ; ; ; 执行存储 ...

  6. MySQL在使用group_concat()函数数据被截取

    遇到问题: 项目中有个需求,MySQL中存储的是树状的数据.现在给出一个节点,需要从Mysql数据库中取出这个节点下所有的节点.采用MySQL的函数. 函数如下: CREATE DEFINER=`ro ...

  7. Mysql中使用find_in_set函数查找字符串

    mysql有个表的字段的存储是以逗号分隔的,如domain字段login.s01.yy.com,s01.yy.com,s02.yy.com.现在要查找s01.yy.com这个.我们用like查找好像不 ...

  8. group_concat函数与find_in_set()函数相结合

    一:group_concat函数详解 1.语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'] ...

  9. 教您如何使用MySQL group_concat函数

    MySQL group_concat函数是典型的字符串连接函数,下面就为您介绍MySQL group_concat的语法,希望对您学习MySQL group_concat函数有所帮助. MySQL g ...

随机推荐

  1. js对象动态赋值

    <view class="movies-template"> <template is="movieListTemplate" data=&q ...

  2. MyBatis01--------概念

    主程序 读取配置 主配置文件 SQL映射文件 1.什么是框架?      ① 框架是一个应用程序的半成品      一个框架程序员可以配置的选择.选项越多,认为这款框架的可扩展性强.       面向 ...

  3. Hibernate课程 初探一对多映射4-2 cascade级联属性

    1 级联属性:hibernate一方和多方设置关联关系,当一方发生相应修改时(见下表),多方不用进行显式修改,也能进行相应修改.   级联在一方和多方xml中都可以设置 属性值 含义和作用 all 对 ...

  4. tomcat多站点部署

    我们可能会有这种场景,一个tomcat想部署两个web工程,说白了就是公用一个端口,那怎么办呢?就是多站点部署,具体步骤如下(这里以linux平台举例): 1)先修改server.xml(conf/s ...

  5. Flask文件目录----- __init__ 文件

    import os from flask import Flask def create_app(test_config=None): # 创建和设置app app = Flask(name, ins ...

  6. jQuery 显示与隐藏 tab选项卡

    方法一:使用display样式:block.none来控制文本的显示与隐藏 <div class="explain_text"> 移动互联网为企业提供了连接用户的新方式 ...

  7. 洛谷P3128 [USACO15DEC]最大流Max Flow(树上差分)

    题意 题目链接 Sol 树上差分模板题 发现自己傻傻的分不清边差分和点差分 边差分就是对边进行操作,我们在\(u, v\)除加上\(val\),同时在\(lca\)处减去\(2 * val\) 点差分 ...

  8. 菜鸟 学注册机编写之 Android app

    0x00前言 环境及工具: 手机    Nexus 4(己root) 系统版本    Android 5.01 工具    AndroidKiller_V1.2 关于Android平台app注册机的编 ...

  9. js 判断浏览器类型

    前言 工作中需要用到判断浏览器类型,网上找到的内容不怎么全,故在此进行一下总结. 一.不同浏览器及版本下User-Agent信息 待续.....欢迎补充 二.根据User-Agent信息进行判断 参考 ...

  10. SQL Server 2008 角色

    固定服务器角色:按照从最低级别的角色(bulkadmin)到最高级别的角色(sysadmin)的顺序进行描述:Bulkadmin:这个服务器角色的成员可以运行BULK INSERT语句.这条语句允许从 ...