借鉴:mysql使用instr达到in(字符串)的效果

结论:select * from 表名where INSTR(CONCAT(字符串),CONCAT(表id))

问题来源:一表中的某字段是另一表的外键,该字段是外键表的id组成的字符串,如“1,2,3,4”这种形式,如何关联查询两张表,根据外键id查询另一张表呢?

该表的设计连第一范式都没有实现,不能容忍!!!!!!!!!!!!!

表一:

表二:

首先想到的思路,对字符串进行遍历查询,但是mybatis中collection不接受string,所以我没有实现这个思路。

        <foreach collection="act_id.split(',')" open="(" separator="," close=")" item="item" >
#{item}
</foreach>

第二个思路,使用concat进行字符串拼接,如“1,2,3,4”转化为(“1,2,3,4”),但是mysql where in 后不可以使用字符串,无法识别,这个思路也没有实现。

第三个思路,使用instr达到in(字符串)的效果

instr函数不懂,instr(str,substr)instr(substr,str)效果截然不同,但是利用select * from 表名where INSTR(CONCAT(字符串),CONCAT(表id)) 实现了需求,mybatis中mapper如下:



    <!--Action结果映射-->
<resultMap id="ActionMapper" type="Action">
<id column="act_id" property="actId"/>
<result column="act_name" property="actName"/>
<result column="machine" property="machine"/>
<result column="count_time" property="countTime"/>
<result column="count_class_id" property="countClassId"/>
<result column="strength_id" property="strengthId"/>
</resultMap>
<select id="getAction" resultMap="ActionMapper">
SELECT * FROM action WHERE INSTR(CONCAT(#{xx}),CONCAT(act_id));
</select>
<!--CoursePlan结果映射-->
<resultMap id="CoursePlanMapper" type="CoursePlan">
<id column="id" property="id"/>
<result column="plan_name" property="planName"/>
<result column="plan_class_id" property="planClassId"/>
<collection column="act_id" property="action" select="getAction"/>
</resultMap>
<insert id="add" parameterType="CoursePlan" >
insert into course_plan (plan_name,plan_class_id,act_id)
-- CONCAT_WS进行字符串拼接,以,为分隔符
values (#{planName},#{planClassId},CONCAT_WS(',',<foreach collection="action" item="actid" open="" close="" separator=",">#{actid.actId}</foreach>))
</insert>
<select id="getone" parameterType="_int" resultMap="CoursePlanMapper">
select * from course_plan where id= #{id}
</select>
<select id="list" resultMap="CoursePlanMapper">
select * from course_plan
</select>
</mapper>

更新:

上述语句出现了bug,本来相查询id为17的值,但是顺带着7也出来了

解决方法:

SELECT * FROM action WHERE INSTR(CONCAT(',',17,','),CONCAT(',',act_id,','))

方法来源于该片博客:mysql使用instr达到in(字符串)的效果

意外发现

SELECT * FROM action WHERE INSTR(CONCAT(act_id),CONCAT(17));

将id字段和字符串互换位置后,这个问题好像 解决了

但是在这种情况下



查询出现问题!!!所以行不通

查询INSTR()的用法,有所明悟:

INSTR(STR,SUBSTR) 在一个字符串(STR)中搜索指定的字符(SUBSTR),返回发现指定的字符的位置(INDEX);

STR 被搜索的字符串

SUBSTR 希望搜索的字符串

在字符串STR里面,字符串SUBSTR出现的第一个位置(INDEX),INDEX是从1开始计算,如果没有找到就直接返回0,没有返回负数的情况。




mysql外键是多个id组成的字符串,查询方法的更多相关文章

  1. day03 mysql外键 表的三种关系 单表查询 navicat

    day03 mysql navicat   一.完整性约束之     外键 foreign key     一个表(关联表: 是从表)设置了外键字段的值, 对应的是另一个表的一条记录(被关联表: 是主 ...

  2. MySQL外键之级联

    简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...

  3. mysql 外键(FOREIGN KEY)

    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...

  4. mysql外键使用和级联

    如下面的: create table applicant (id int not null auto_increment primary key, jobId int not null, studen ...

  5. Mysql 外键设置

    MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个:    一个是让数据库自己通过外键来保证数据的完整性和一致性    一个就是能够增加ER图的可读性    有些人认为外键的建立会给 ...

  6. MySQL外键的作用和创建

    MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( ` ...

  7. Mysql外键的使用

    MySQL外键(请确保数据库是innodb类型)网上有很多介绍的文章,这里我就凭自己的理解再次整理了下,废话不多说,直入正题哈.外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据 ...

  8. mysql 外键和子查询,视图

    1.mysql 外键约束 建表时生成外键   foreing key ('sid') references' student'('id'); 建表后添加外键  alter table' course ...

  9. mysql外键使用和事物使用

    mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存 ...

随机推荐

  1. 爬虫定时任务 redis 减轻 mysql 读的压力 加层

    非工作时间,定时任务爬虫大量mysq短链接,影响了其他业务的,mysql 报 too many connections  错误 将爬虫url池放入到redis中,单独的脚本维护redis url池的更 ...

  2. Robot Framework 怎样写好Test Case

    1.介绍 这是一个关于如何用Robot Framework写好Test Case的高层次的指导准则 怎样实际的与系统进行交互不在此文档范围内 最重要的准则是使测试用例尽可能的让熟悉此领域的人觉得简单易 ...

  3. 【Codeforces】665E Beautiful Subarrays

    E. Beautiful Subarrays time limit per test: 3 seconds memory limit per test: 512 megabytes input: st ...

  4. 类型配置命名空间 —— XML schema

    对于基于 XML 的配置,Spring 2.0 以后告别 DTD 格式(Document Type Definition)的配置文件,开始采用 Schema 格式,Schema 的突出亮点即是可让不同 ...

  5. P2610 [ZJOI2012]旅游 树的直径

    这个题就是建图不太好建,但是我们一想,三角形貌似只能两两挨着,最后会变成一个二叉树,所以问题就变成求树的直径.建图用pair套map超级简单. 题干: 到了难得的暑假,为了庆祝小白在数学考试中取得的优 ...

  6. linux shell 实例1

    UI项目删除“UIL”文件中的无用字串: 脚本需要制定UIL文件目录位置&无用字串的txt文件,如删除海尔目录下的无用字串: ./delete_uil_string.sh ./haier/UI ...

  7. bzoj 1623: [Usaco2008 Open]Cow Cars 奶牛飞车【排序+贪心】

    从小到大排个序,然后能选就选 #include<iostream> #include<cstdio> #include<algorithm> using names ...

  8. 基于.Net Core的API框架的搭建(4)

    6.加入日志功能 日志我们选用log4net,首先引入程序包: 选择2.0.8版本安装.然后在项目根目录新增log4net的配置文件log4net.config: <?xml version=& ...

  9. 51nod1298 圆与三角形

    1298 圆与三角形 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三 ...

  10. ACM_数数有多少(第二类Stirling数-递推dp)

    数数有多少 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小财最近新开了一家公司,招了n个员工,但是因为资金问题,办公楼只有m间 ...