Mysql数据库多对多关系未建新表
原则上,多对多关系是要新建一个关系表的,当遇到没有新建表的情况下如何查询多对多的SQL呢?
FIND_IN_SET(str,strlist)
官网:http://dev.mysql.com/doc/refman/5.7/en/string-functions.html
Mysql数据库
此数据库为设计不合理的demo,仅用来示范多对多关系。
创建表结构
-- 新建user表
CREATE TABLE `user` (
`id` INT(11) NOT NULL COMMENT '人员id',
`uname` VARCHAR(50) NULL DEFAULT NULL COMMENT '人员姓名',
`hobbies` VARCHAR(255) NULL DEFAULT NULL COMMENT '业余爱好id(以逗号分割)',
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
-- 新建业余爱好表
CREATE TABLE `hobby` (
`id` INT(12) NOT NULL AUTO_INCREMENT COMMENT '爱好id',
`name` VARCHAR(255) NULL DEFAULT NULL COMMENT '爱好名称',
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=0;
关联关系所在表查询
关联关系都在user表中,查询user表并显示该用户所有的兴趣。
当用FIND_IN_SET作为关联关系函数时,查询如下。
再用上group by与group_concat函数。
SQL语句如下:
SELECT
u.*,
group_concat( h.`name` ) AS hbs
FROM
USER u
LEFT JOIN hobby h ON FIND_IN_SET( h.id, u.hobbies )
GROUP BY
u.id
查询结果如下:
非关联关系所在表查询
查询该兴趣有多少user感兴趣。
SELECT u.* FROM user u WHERE FIND_IN_SET(#{hid},u.hobbies);
查询结果如下:
把关联关系所在表逗号分割的字段查询为多条记录
select u.*,substring_index(substring_index(u.hobbies,',',b.help_topic_id+1),',',-1) hob
from user u join
mysql.help_topic b
on b.help_topic_id < (length(u.hobbies) - length(replace(u.hobbies, ',', '')) + 1)
order by u.id;
on后面的语句:用length、replace函数计算对应的多少条记录。b.help_topic_id打印出来的值为0 1 2 3...
substring_index的select列: 先用一次substring_index,分别截取字符串1个、2个、3个,然后再用一次substring_index截取最后一位从而达到目的。
Mysql数据库多对多关系未建新表的更多相关文章
- linux定时查询mysql数据库并把结果保存到新表 然后备份数据库
脚本文件名:myshell内容如下: #!/bin/bash # mysql用户名 username="root" # mysql密码 password="root&qu ...
- mysql数据库——特殊sql语句整理之修改表结构
建表 先讲一下常规建表: CREATE TABLE testCreate ( id ) NOT NULL auto_increment, time ) NOT NULL, type ) NOT NUL ...
- MySQL临时表创建及旧表建新表
1.创建临时表 临时表是一张表,用来临时保存一些数据 特点: 只对创建该临时表的用户可见: 当会话结束时,MySQL自动删除临时表. 临时表的核心:建表和删表消耗资源极其少 创建临时表的基本格式: C ...
- Flask 数据库多对多关系
数据库使用关系建立记录之间的联系.其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起.实现这种关系时,要在“多”这一侧加入一个外键,指向“一”这一侧联接的记录.大部分的其他关系 ...
- Hibernate多对多关系映射(建表)
下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...
- Linux下开发python django程序(django数据库多对多关系)
1.多对多关系数据访问 models.py设置 from django.db import models # Create your models here. sex_choices=( ('f',' ...
- Oracle-创建新表,创建备份表,对表中插入多条数据
一.创建新表 0.基本语法 create table 表名称(id varchar2(50) primary key ,name char(200) not null,phone number(11) ...
- MySQL通过SQL语句来直接生成新表
1. 既复制表结构,也复制表数据 mysql> CREATE TABLE tmp_table SELECT * FROM dede_news; 说明:这种方法的缺点就是新表中没有了旧表的prim ...
- mysql数据库的十种查询方式及多表查询
--mysql数据库的十种查询方式 -- (1)查询时起别名 SELECT id AS '编号',NAME AS '姓名',age AS '年龄' FROM student; -- (2)查询时添加常 ...
随机推荐
- linux安装java jdk
一.检查是否已经安装java jdk. 检查是否有自带的openJdk, 若有将其卸载删除.详情第四步 二.jdk下载安装. 1.创建文件夹 mkdir /usr/local/java #自选目录,一 ...
- eclipse scala Could not reserve enough space for object heap
[学习笔记] 防盗版实名手机尾号:73203 Could not reserve enough space for object heap 解决方法:下面的缩写中:一个是memory max(Xmx) ...
- (二)mybatis框架原理(图解)
目录 mybatis 框架原理图(粗略版) mybatis 框架原理图(粗略版)
- vs code在打开新文件是覆盖上一个窗口的问题
设置里面有个 enablePreview 去掉就好
- Equations HDU - 1496(哈希的应用)
Problem Description Consider equations having the following form: a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 a, b ...
- analysis_tools
- springCloud的feign异常:RequestHeader参数为空时,对key加了大括号{}
好久没写博客了,今天趁着周末把工作中遇到的问题梳理一下(在这个问题排查过程中,发现自己排查问题的能力还是太弱了,需要加强). 最近在公司springCloud的项目里,通过feign远程调用其他服务, ...
- python简答
解释 GIL 全局解释器锁 def func(*args): for i in args: print(i) func(3,2,1,4,7) 在我们不知道该传递多少关键字参数时,使用**kwargs ...
- vue-动态路由+动态组件+动态页面
动态路由 路由组件是vue-router 动态路由即从后端请求路由信息,然后转化生成路由信息.所以这里的关键是不会提前知道什么菜单对应什么组件,因此路由声明的时候不再是写死的组件,而是可替换的动态路径 ...
- asp.net 自动检测缓存内容是否变化
1 使用cache.Insert方法时,新建一个System.Web.Caching.CacheDependency对象,告诉缓存,当缓存的内容发生变化时,将删除缓存,并重新缓存 using Syst ...