当前位置:   article > 正文

一个表的外键是有多个值组成,并由逗号分隔,如何与其他表关联查询?_java一个字段如何与另一个通过逗号分割的字段连表查询

java一个字段如何与另一个通过逗号分割的字段连表查询

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

问题的场景

在开发的过程中,博主遇到了一个问题。由于其他人建表的时候没有严格的遵守第一范式的设计模式,导致一个字段里含有多个值,并以逗号分隔,但是这个字段又作为外键要与其他表的主键进行关联。如下图。这个表里的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里用了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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

然后在测试的时候看到控制台打印出来的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)
  • 1
  • 2

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

尝试办法二:动态传值

然后我就想到把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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/268400
推荐阅读
相关标签
  

闽ICP备14008679号