You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关联含多值列的两张表?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:05:47