如何关联含多值列的两张表?SQL关联查询问题求助
关联逗号分隔ID字段获取对应名称的解决方案
问题场景
现有两张表:
users表:包含id、name、interest字段,其中interest存储逗号分隔的兴趣ID(如"1,2"或1,2)interests表:存储兴趣ID和名称,数据如下:
id | name ------------- 1 | business 2 | farming 3 | fishing
需要关联两表,将users.interest中的所有ID对应的兴趣名称拼接成逗号分隔的字符串,得到如下结果:
id | name | interest | interest_name ---------------------------------------------- 1 | username | "1,2" | "business, farming" 2 | username | "2,3" | "farming, fishing"
原SQL的问题
你之前的SQL使用users.interest = interests.id作为关联条件,这会将整个逗号分隔的字符串与单个兴趣ID直接比较,只有当interest是单个ID时才能匹配,无法匹配多个ID的情况,因此只能获取到第一个匹配的名称。
正确的SQL语句
情况1:users.interest字段不带引号存储(实际值为1,2而非"1,2")
SELECT users.id, users.name, users.interest, GROUP_CONCAT(interests.name SEPARATOR ', ') AS interest_name FROM users LEFT JOIN interests ON FIND_IN_SET(interests.id, users.interest) > 0 GROUP BY users.id, users.name, users.interest;
情况2:users.interest字段带双引号存储(实际值为"1,2")
需要先使用TRIM函数去除字段两端的双引号,再进行匹配:
SELECT users.id, users.name, users.interest, GROUP_CONCAT(interests.name SEPARATOR ', ') AS interest_name FROM users LEFT JOIN interests ON FIND_IN_SET(interests.id, TRIM(BOTH '"' FROM users.interest)) > 0 GROUP BY users.id, users.name, users.interest;
关键说明
FIND_IN_SET(str, strlist):该函数用于判断str是否存在于逗号分隔的字符串strlist中,返回匹配的位置(大于0表示存在),这是实现多ID关联的核心。GROUP_CONCAT(expr):将分组后的多个expr值拼接成一个字符串,通过SEPARATOR指定分隔符(默认是逗号,这里指定为,更符合示例格式)。GROUP BY:必须包含users表中所有非聚合字段(id、name、interest),确保每个用户只返回一行结果,避免因分组规则导致的数据丢失。
内容的提问来源于stack exchange,提问作者Hamza Khalid
相关产品推荐
相关产品推荐

