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;

原文地址:https://www.cnblogs.com/aeolian/p/12082090.html

时间: 2024-10-17 13:04:02

Mysql数据库多对多关系未建新表的相关文章

MySQL数据库的基础操作(建表,建库,插入,删除)

留给我健忘的记忆,希望他知道这里还有一些记忆!! 下面将是以多实例模式登录数据库然后创建一个库并完成建表,插入数据,删除数据,更新数据的操作. 1 登录数据库 [[email protected] ~]# mysql -uroot -p123456 -S /data/3306/mysql.sock 2 创建数据库,指定utf8字符集来支持中文,当然,如果你的数据库编译的时候已经指定默认字符集为utf8这里就不需要再次指定了. mysql> create database wodejia char

MySQL创建临时表-旧表建新表

1.创建临时表 临时表是一张表,用来临时保存一些数据 特点: 只对创建该临时表的用户可见: 当会话结束时,MySQL自动删除临时表. 临时表的核心:建表和删表消耗资源极其少 创建临时表的基本格式: CREATE TEMPORARY TABLE  tbl_name(--); ①创建的临时表在当前会话,正常使用 ②断开连接,再重新连接后执行查询,抛出异常: 错误代码: 1146 Table 'db_name.temtbl_name' doesn't exist.//该临时表在会话结束的时候被系统删除

Flask 数据库多对多关系

数据库使用关系建立记录之间的联系.其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起.实现这种关系时,要在"多"这一侧加入一个外键,指向"一"这一侧联接的记录.大部分的其他关系类型都可以从一对多类型中衍生. 多对一关系从"多"这一侧看,就是一对多关系. 一对一关系类型是简化版的一对多关系, 限制"多"这一侧最多只能有一个记录.唯一不能从一对多关系中简单演化出来的类型是多对多关系,这种关系的两侧都有多个记

MySQL数据库学习【第六篇】表与表之间的关系

表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 表2的多条记录也可以对应表1的一条记录 一对一: 表1的一条记录唯一对应表2的一条记录,反之亦然 分析时,我们先从按照上面的基本原理去套,然后再翻译成真实的意义,就很好理解了 1.先确立关系 2.找到多的一方,吧关联字段写在多的一方 一.多对一或者一对多(左边表的多条记录对应右边表的唯一一条记录)

Hibernate多对多关系映射(建表)

下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了Hibernate多对多关系映射,则中间关系表不会生成实体(即没有对应的pojo类,更没有其映射文件). 1.建立表 DROP TABLE user_course ; DROP TABLE user ; DROP TABLE course ; CREATE TABLE user ( userid  

MYSQL数据库之如何在已经建立好表之后重构数据表

表一:mysql> select * from employee;+----+--------+---------+| id | name | manager |+----+--------+---------+| 1 | 张三 | 李红 || 2 | 张三 | 李红 || 3 | 王五 | 刘倩 || 4 | 马六 | 马芳 || 5 | 孙杨 | 明德 || 6 | 郭德纲 | 华北 |+----+--------+---------+ 表二:表二的数据填充有所不同,如下:sql:inser

MySQL通过SQL语句来直接生成新表

1. 既复制表结构,也复制表数据 mysql> CREATE TABLE tmp_table SELECT * FROM dede_news; 说明:这种方法的缺点就是新表中没有了旧表的primary key.Extra(auto_increment)等属性, 只能自己手动添加. 2.只复制表结构,而不复制表数据 mysql> CREATE TABLE tmp_table like dede_news;

MySQL数据库应用(11)DML之表和字段

一.删除表中数据 1.实践删除表中的数据 1)命令语法:delete from 表名 where 表达式 a.实践,例如:删除表test中编号为1的记录 mysql> use oldboy Database changed mysql> select * from test; +----+-----------+ | id | name | +----+-----------+ | 1 | oldboy | | 2 | oldgirl | | 3 | inca | | 4 | zuma | |

Mysql学生管理系统:表的建立,外键一对多,多对多关系,中间关联表的建立

学生管理系统 管理员注册/登录/注销 注册班级(班级详细信息) 注册学生信息 查看班级信息/查看老师资料 教师注册/注销  查看教师资料  查看学生资料  根据名称/班级/ 查看学生详细信息--支持模糊 注册科目 管理员(admini) ad_id(管理员id)     ad_number(管理员账号) ad_pass(管理员密码)    ad_yn(管理员是否禁用) create table admini( ad_id int PRIMARY KEY AUTO_INCREMENT,-- 主键自