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作为关联关系函数时,查询如下。

Mysql数据库多对多关系未建新表详解数据库

再用上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

查询结果如下:

Mysql数据库多对多关系未建新表详解数据库

非关联关系所在表查询

查询该兴趣有多少user感兴趣。

SELECT u.* FROM user u WHERE FIND_IN_SET(#{hid},u.hobbies);

查询结果如下:

Mysql数据库多对多关系未建新表详解数据库

把关联关系所在表逗号分割的字段查询为多条记录

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数据库多对多关系未建新表详解数据库

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/3935.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论