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)查询时添加常 ...
随机推荐
- Spark Scala当中reduceByKey(_+_) reduceByKey((x,y) => x+y)的用法
[学习笔记] reduceByKey(_+_)是reduceByKey((x,y) => x+y)的一个 简洁的形式*/ val rdd08 = sc.parallelize(List((1, ...
- 如何使用RedisTemplate访问Redis数据结构之字符串操作
Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集 ...
- S02_CH16 等精度频率计实验
S02_CH16 等精度频率计实验 在了解了AXI总线之后,今天我们自己动手设计一个带AXI4-Lite总线的IP,来完成频率计的实验. 频率计虽然小,但是也算五脏俱全,涉及到zynq的方方面面,比如 ...
- 核发电站 (dp前缀优化)
大意: $n$个城市, $m$种核电站, 第$i$种假设要建在第$x$个城市, 必须满足$[x-i,x+i]$范围内无其他核电站, 求建核电站的方案数. 简单$dp$题, 设$dp[i][j]$为位置 ...
- 怎样获取xhr的当前状态
一个XMLHttpRequets实例从创建到发起请求再到获取数据, 期间会有一些中间状态, 这些状态是必要的, 我们可以通过判断这些状态值来进行不同的动作. xhr中获取请求状态的属性是: xhr.r ...
- 服务器上office不能正常使用?
(1)确保dll版本和服务器上office版本一致 (2)配置dcom (3)项目配置文件中添加用户模拟语句 <system.web> <identity impersonate=& ...
- 【转】js原型链与继承
原文链接:https://blog.csdn.net/u012468376/article/details/53127929 一.继承的概念 继承是所有的面向对象的语言最重要的特征之一.大部分的o ...
- 页面加载完毕后调用js方法进行布局操控 已实验
页面加载完毕后调用js方法进行布局操控 已实验 $(function(){ var check1 = $("[id$=SMS]").is(':checked'); var bl=$ ...
- Chrome开发者工具中Elements(元素)断点的用途
SAP Engagement Center UI的这个按钮会每秒钟刷新一次,显示页面已经打开了多长时间. 需求:需要找到哪行JavaScript代码不断刷新的按钮文字. 按照经验判断,这个文字肯定是一 ...
- openstack 平台P2V迁移
目录 [Openstack]P2V迁移 一.前言 二.前提准备 三.操作步骤 1.安装迁移中转机 2.配置中转机 3.创建存储池(可选) 4.制作virt-p2v的 U盘引导启动工具 5.操作物理机, ...