MySQL四表关联查询问题:多字段重复取同一字段值的解决方法
解决MySQL四表关联中多字段取自同一张表导致值重复的问题
嘿,这个问题我之前做项目的时候也踩过坑!你现在的查询里所有目标字段都只关联了一次tableD,而且不管是service、vendor还是category、action都用了同一个C.value,结果当然会全部相同啦。
问题根源
看起来tableD应该是一个键值对字典表(比如存储各种枚举值、配置项的表),每条记录对应一种类型的取值(比如一条是vendor,一条是service)。你现在只关联了一次tableD,只能拿到其中一种类型的值,自然没法区分这几个字段。
解决方案:多次关联tableD
核心思路是:针对每个需要的字段(service、vendor、category、action),分别关联一次tableD,每次关联时指定对应的过滤条件(比如类型匹配、外键匹配),这样就能拿到各自对应的值了。
假设你的表结构满足以下条件(如果不是,你可以根据实际情况调整):
tableB里有分别对应service、vendor、category、action的外键字段,比如service_id、vendor_id、category_id、action_idtableD里有一个用来区分记录类型的字段(比如type),值分别为'service'、'vendor'、'category'、'action'
修改后的SQL如下:
SELECT A.ticket_id, A.number, B.subject, C_service.value AS service, C_vendor.value AS vendor, C_category.value AS category, C_action.value AS action FROM tableA A LEFT JOIN tableB B ON A.ticket_id = B.ticket_id -- 关联service对应的字典记录 LEFT JOIN tableD C_service ON C_service.id = B.service_id AND C_service.type = 'service' -- 关联vendor对应的字典记录 LEFT JOIN tableD C_vendor ON C_vendor.id = B.vendor_id AND C_vendor.type = 'vendor' -- 关联category对应的字典记录 LEFT JOIN tableD C_category ON C_category.id = B.category_id AND C_category.type = 'category' -- 关联action对应的字典记录 LEFT JOIN tableD C_action ON C_action.id = B.action_id AND C_action.type = 'action' WHERE A.ticket_id IN (28, 36, 149);
额外优化点
- 把原来的
OR条件改成IN,代码更简洁易读 - 记得给每个关联的
tableD取不同的别名(比如C_service、C_vendor),避免字段冲突
如果你的tableD区分类型的方式不是type字段(比如通过不同的id范围或者其他字段),只需要调整每个LEFT JOIN里的过滤条件就行,核心逻辑不变。
内容的提问来源于stack exchange,提问作者twister
相关产品推荐
相关产品推荐

