MySql连表之多对多

背景

每个男生和女生都可以选择自己最喜欢的几个人,可以是多个也可以使一个。

但是,在创建男生表的时候,女生表并没存在,所以不能在创表初期就在男生表中加入其喜爱的女生名单,而且名字冗余,存储浪费空间。

设计表

1、表一:man

2、表二:woman

3、表三:man_to_woman

  1. 小赵<-->小花
  2. 小赵<-->小朵
  3. 小赵<-->小楠
  4. 小孙<-->小雨
  5. 小钱<-->小楠
  6. 小李<-->小花

创建外键

找到小赵喜欢的人

1 SELECT
2     *
3 FROM
4     man_to_woman
5 LEFT JOIN man ON man_to_woman.man_id = man.nid
6 LEFT JOIN woman ON man_to_woman.woman_id = woman.nid
7 WHERE
8     man. NAME = "小赵"

Demo

分析SELECT * from man_to_woman LEFT JOIN man on man_to_woman.man_id = man.nid

从关系表中找到所有man中nid与关系表中的man.id相等的数据,将以man_to_woman为主,man只显示与之向对应的内容,man为字典表。

分析LEFT JOIN woman on man_to_woman.woman_id = woman.nid

找到与上边结果中的woman_id相等的woman表中nid的所有元素,以上表为主,woman为字典表。

分析where man.name = "小赵"

找到上边中man的name为小赵的,成功找到他的3个心仪对象

时间: 2024-08-13 07:16:59

MySql连表之多对多的相关文章

mysql订单表如何设计?

mysql订单表如何设计? 商品表和订单表 . 通过一个表来关联. 那删除了商品,相关联的订单表如何显示出这个已经删除的商品? 订单表需要冗余商品名.商品编号.价格等基本信息. 不能只保存一个商品主键,这个是订单表的基本原则,同时生成了订单的商品是不能删除的. 订单表中引用商品表主键,删除使用状态假删. 同时引入商品的状态,总之就是反范式设计,保证一次可以获得全部要的状态,不要进行多表jion. 订单:  分为以下几种 订单凭证(接到客户的订单表),采购订单, 销售订单,委外订单 我的数据库 该

Mybatis的多表(多对多)查询

Mybatis的多表(多对多)查询 示例:用户和角色 一个用户可以有多个角色 一个角色可以赋予多个用户 解决办法 建立两张表:用户表,角色表 让用户表和角色表具有多对多的关系.需要使用中间表,中间表包含各自的主键,在中间表中是外键. 建立两个实体类:用户实体类和角色实体类 让用户和角色的实体类能体现出来多对多的关系 各自包含对方一个集合引用 建立两个配置文件 用户的配置文件 角色的配置文件 实现配置 当我们查询用户时,可以同时得到用户所包含的角色信息. 当我们查询角色时,可以同时得到角色所赋予的

mysql单表限制

mysql单表的限制 一.MySQL数据库的MyISAM存储 引擎单表大小限制已经不是有MySQL数据库本身来决定(限制扩大到64pb),而是由所在主机的OS上面的文件系统来决定了. 在mysql5.0版本之前,myisam存储引擎默认表的大小4Gb,可以用一下命令来查看: [[email protected] test]# cd /data/mysql/mysql_3306/data/test [[email protected] test]# myisamchk -dv t2 MyISAM

mysql分表方法-----MRG_MyISAM引擎分表法

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解. 首先,我们需要想好到底分多少个表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,

关于Mysql删除表数据的两种方式对比

1.delete from table_name 一行一行删除,只删除表数据,auto_increament仍停留在最后一天数据的下一个值. 2.truncate table_name 快捷删除表数据.先删除整个表,然后重新建表结构.auto_increament从1开始. 关于Mysql删除表数据的两种方式对比,布布扣,bubuko.com

python3 mysql 多表查询

python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male'

查看和改动MySQL数据库表存储引擎

要做一名合格的程序猿,除了把代码写的美丽外,熟知数据库方面的知识也是不可或缺的.以下总结一下怎样查看和改动MySQL数据库表存储引擎:        1.查看数据库所能支持的存储引擎:show engines;        2.查看某个数据库中某个表所使用的存储引擎:show table status from db_name where name='table_name';(注:将where条件去掉后能够查看某个数据库中全部表的存储引擎情况)        3.改动表引擎方法:alter t

详解MySQL大表优化方案

当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用TINYINT.SMALLINT.MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED VARCHAR的

针对MySQL大表优化方案

详解MySQL大表优化方案 (1).字段 (2).索引 (3).规范查询SQL (4).存储引擎 (5).mysql配置参数优化 (6).mysql读写分离 (7).分区和分表 单表优化: 当单表的数据不是一直在暴增,不建议使用拆分,拆分会带来逻辑,部署,运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量 (1).字段 l 尽量使用TINYINT.SMALLINT