作者:株洲市网商会 | 来源:互联网 | 2023-10-12 18:44
原则上,多对多关系是要新建一个关系表的,当遇到没有新建表的情况下如何查询多对多的SQL呢?FIND_IN_SET(str,strlist)官网:http:dev.mysql.com
原则上,多对多关系是要新建一个关系表的,当遇到没有新建表的情况下如何查询多对多的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;
Mysql数据库多对多关系未建新表