码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2019-12-23 13:30:53      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:结构   color   absolute   fun   info   多少   func   mysql   str   

原则上,多对多关系是要新建一个关系表的,当遇到没有新建表的情况下如何查询多对多的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数据库多对多关系未建新表

标签:结构   color   absolute   fun   info   多少   func   mysql   str   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!