赞
踩
在开发的过程中,博主遇到了一个问题。由于其他人建表的时候没有严格的遵守第一范式的设计模式,导致一个字段里含有多个值,并以逗号分隔,但是这个字段又作为外键要与其他表的主键进行关联。如下图。
这个表里的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}+','
) <> 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去进行关联查询了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。