Mysql数据库多对多关系未建新表
Posted 秋夜雨巷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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数据库多对多关系未建新表的主要内容,如果未能解决你的问题,请参考以下文章
如果您在 MySQL 数据库中执行多对多关系,是不是有必要将所有键 id 传输到连接表?
MySQL 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积