一个表的外键是有多个值组成,并由逗号分隔,如何与其他表关联查询?

一个表的外键是有多个值组成,并由逗号分隔,如何与其他表关联查询?

问题的场景

在开发的过程中,博主遇到了一个问题。由于其他人建表的时候没有严格的遵守第一范式的设计模式,导致一个字段里含有多个值,并以逗号分隔,但是这个字段又作为外键要与其他表的主键进行关联。如下图。这个表里的tenant_id就是外键
这个表里的tenant_id就是外键,可以存在多个以逗号分隔。
在这里插入图片描述
tenant_id关联的主表是这个
在这里插入图片描述
如何根据tenant_id去查询focus表里的信息呢?

尝试办法一:简单查询

在刚遇到这个问题的时候,想到的办法是匹配,用tenant_id去匹配focus表里的字段,于是sql是这样的:

SELECT
			count(*) AS total
		FROM
			crowd.s_focus 
		WHERE
			f.`status` = 1
		AND instr(
			concat(',', tenant_id, ','),
			',1,'
		) <> 0

这里用了instr函数去匹配,这样是解决了查询tenant_id是1的问题,但是如果需求变了呢,这个tenant_id是个动态传入的值,然后我一开始头脑简单的就字符串拼接了一下:

SELECT
		d.label AS personType,
		COUNT(f.person_type) AS personTypeCount
		FROM
		crowd.s_focus f
		LEFT JOIN system.z_dict d ON d.`value` = f.person_type
		WHERE
		d.type = 'personType'
		AND instr(
		concat(',', f.tenant_id, ','),
		','+#{tenantId}+','
		) &lt;&gt; 0
		GROUP BY
		f.person_type

然后在测试的时候看到控制台打印出来的sql是这样的:

Preparing: SELECT d.label AS personType, COUNT(f.person_type) AS personTypeCount FROM crowd.s_focus f LEFT JOIN system.z_dict d ON d.`value` = f.person_type WHERE d.type = 'personType' AND instr( concat(',', f.tenant_id, ','), ','+?+',' ) <> 0 GROUP BY f.person_type 
	Parameters: 1(String)

这样肯定是不可以的,所以又去网上找材料,另谋出路。

尝试办法二:动态传值

然后我就想到把tenant_id按照逗号分隔然后行转列进行关联,在网上找到别人的解决办法:
https://sunjia-704471770-qq-com.iteye.com/blog/1912929

先利用substring_index方法进行截取,然后用help_topic去行转列,再与主表关联:

SELECT
	*
FROM
	crowd.s_focus cf
LEFT JOIN (
	SELECT
		f.id,
		substring_index(
			substring_index(
				f.tenant_id,
				',',
				b.help_topic_id + 1
			),
			',',
			- 1
		) AS tenantId
	FROM
		crowd.s_focus f
	JOIN mysql.help_topic b ON b.help_topic_id < (
		LENGTH(f.tenant_id) - LENGTH(
			REPLACE (f.tenant_id, ',', '')
		) + 1
	)
) tl ON tl.id = cf.id where cf.tenant_id = #{tenant_id} group by cf.id

这样就可以根据传进来的tenant_id去进行关联查询了。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值