sqlserver替换mysql中的find_in_set()函数和mysql中group_contact()函数的方法

      在平常的业务逻辑中,当两个对象之间是多对多关系的时候,我们建表一般有两种方法,一种就是建立一个中间表,还有一种就是在一张表中的某一个字段,存另一个对象的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?

                           

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值