在平常的业务逻辑中,当两个对象之间是多对多关系的时候,我们建表一般有两种方法,一种就是建立一个中间表,还有一种就是在一张表中的某一个字段,存另一个对象的id逗号隔开的那种形式。今天我们主要针对第二种方法的一些处理,因为,在mysql中和sqlerver中,针对逗号隔开的形式的处理,两种数据库的处理是不一样的。当然orcal数据库也是不一样的,今天暂时不写orcal数据库的不同。
准备工作:我们需要先建立两张表。用户表和按钮表(图一cust表 图二按钮表)
下面我们通过做题的形式,来进行理解两种数据库对这两个函数的不同
1.查找出含有审核或者发布按钮的用户
(1)mysql中的解决方法
SELECT *
from cust
where FIND_IN_SET('4',buttonids) or FIND_IN_SET('5',buttonids)
(2)sqlserver中的解决方法
SELECT * from cust
where
(buttonids like '%,4' or buttonids like '4,%' or buttonids like '%,4,%' or buttonids = '4')
or
(buttonids like '%,5' or buttonids like '5,%' or buttonids like '%,5,%' or buttonids = '5')
结果:
2.查询出用户列表,同时后面跟一列显示该用户所拥有的 按钮名称也是逗号隔开的那种形式
(1)mysql中的解决方法
SELECT
ta.custid,
ta.username,
GROUP_CONCAT(ta.buttonname) AS buttonnames,
GROUP_CONCAT(ta.buttonname,'--',ta.buttonid) AS buttonidandnames
FROM
(
SELECT
c.custid,
c.username,
c.`password`,
c.buttonids,
b.buttonid,
b.buttonname,
FIND_IN_SET(b.buttonid, c.buttonids) nums
FROM
cust c,
t_button b
) ta
WHERE
ta.nums > 0
GROUP BY
ta.custid,
ta.username
(2)sqlserver中的解决方法
SELECT
c.custid,
c.username,
stuff (
(
SELECT
',' + CONVERT (VARCHAR, b.buttonname)
FROM
t_button b
WHERE
1 = 1
AND charindex (
',' + CONVERT (VARCHAR, b.buttonid),
',' + c.buttonids
) > 0 FOR XML path ('')
),
1,
1,
''
) AS buttonnames,
stuff (
(
SELECT
',' + CONVERT (VARCHAR, b.buttonname) + '--' + b.buttonid
FROM
t_button b
WHERE
1 = 1
AND charindex (
',' + CONVERT (VARCHAR, b.buttonid),
',' + c.buttonids
) > 0 FOR XML path ('')
),
1,
1,
''
) AS buttonidandnames
FROM
cust c
结果:
用到的知识点:
a.find_in_set('a', 列名称)
b.group_contact(列名称),该函数,应用在group by分组之后的数据。
c.sqlserver中的stuff函数。
补充的知识点:
a.find_in_set(列名称,'a,b,c,d') 类似于 列名称 in (a,b,c,d);
b.contact(列名称1,列名称2,列名称3) as names 将其他列的值连起来
参考链接:
https://blog.csdn.net/qq_35374517/article/details/76687049
https://www.cnblogs.com/xiaoxi/p/5889486.html
https://www.cnblogs.com/blazezzz/p/7359575.html?%20?%20?