mysql外键是多个id组成的字符串,查询方法
借鉴: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组成的字符串,查询方法的更多相关文章
- day03 mysql外键 表的三种关系 单表查询 navicat
day03 mysql navicat 一.完整性约束之 外键 foreign key 一个表(关联表: 是从表)设置了外键字段的值, 对应的是另一个表的一条记录(被关联表: 是主 ...
- MySQL外键之级联
简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...
- mysql 外键(FOREIGN KEY)
最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...
- mysql外键使用和级联
如下面的: create table applicant (id int not null auto_increment primary key, jobId int not null, studen ...
- Mysql 外键设置
MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加ER图的可读性 有些人认为外键的建立会给 ...
- MySQL外键的作用和创建
MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( ` ...
- Mysql外键的使用
MySQL外键(请确保数据库是innodb类型)网上有很多介绍的文章,这里我就凭自己的理解再次整理了下,废话不多说,直入正题哈.外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据 ...
- mysql 外键和子查询,视图
1.mysql 外键约束 建表时生成外键 foreing key ('sid') references' student'('id'); 建表后添加外键 alter table' course ...
- mysql外键使用和事物使用
mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存 ...
随机推荐
- HDU2138 素数判定
HDU2138 给定N个32位大于等于2的正整数 输出其中素数的个数 用Miller Rabin 素数判定法 效率很高 数学证明比较复杂,略过, 会使用这个接口即可. #include<iost ...
- 命令搜索命令(whereis、which)
一.whereis命名 解释:搜索系统命令所在的位置,不能查询文件 语法:whereis 命令 -b 之查找可执行的文件在哪里 -m 只查找帮助文件 二.which 命令 解释:能搜索命令所在位置, ...
- 关于Java泛型的?和 T 的区别
java中的?号指未知的类型:而T指具体类型 泛型问号(?)未知的类型就是可以指定当前问号(?)所代表的类,可以指定上限(extends)和下限(super) 泛型T指已经具体知道了类型,就是不能指定 ...
- html表格合并单元格
th标签 合并列 colspan="k" 合并行 rowspan="k" 例子<th colspan="2", rowspan=& ...
- [App Store Connect帮助]六、测试 Beta 版本(3.2)管理测试员:邀请外部测试员
在您上传至少一个构建版本之后,您可以邀请外部测试员(您组织之外的人员)使用“TestFlight Beta 版测试”来测试您的 App.为了使您的构建版本可用于外部测试,请创建一个群组.添加构建版本, ...
- CF17C Balance
题意 [题目描述] 一个仅由a,b,c三种字符组成的字符串,可以对其进行如下两种操作: 选择两个相邻字符,将第一个字符替换成第二个. 选择两个相邻字符,将第二个字符替换成第一个. 这样,通过任意多次的 ...
- [USACO09NOV]灯Lights
题目描述 Bessie and the cows were playing games in the barn, but the power was reset and the lights were ...
- {Python}安装第三方包(setup.py)
在github上下载了records文件到本地. 解压文件 cmd切换到文件setup.py的目录下 先执行 python setup.py build 再执行python setup.py inst ...
- 232 Implement Queue using Stacks 用栈来实现队列
使用栈来实现队列的如下操作: push(x) -- 将一个元素放入队列的尾部.pop() -- 从队列首部移除元素.peek() -- 返回队列首部的元素.empty() -- 返回队列是否为空.注意 ...
- JS简单路由实现
说一下前端路由实现的简要原理,以 hash 形式(也可以使用 History API 来处理)为例, 当 url 的 hash 发生变化时,触发 hashchange 注册的回调,回调中去进行不同的操 ...