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

MySQL关联3张表查询问题:解决JOIN语法错误与分栏输出需求

解决多表关联并生成分列式输出的问题

首先看你原来的查询语句,语法错误出在OR JOIN这部分——SQL里根本没有这种写法。你想同时关联Product和Service表,正确的姿势是用LEFT JOIN分别关联这两个表,而非用OR连接JOIN语句。

另外你提到用UNION达不到需求,这点很准确,因为UNION是把两个查询的结果合并到同一列里,而你要的是把Product和Service作为独立列展示,所以用LEFT JOIN才是正确方向,它能保留所有Profiles记录,同时匹配对应的产品和服务分类。

下面是完全贴合你输出格式的修正后查询语句:

SELECT 
  IFNULL(CONCAT(UPPER(JSON_EXTRACT_SCALAR(p.DATA,'$.firstName')), ' ', UPPER(JSON_EXTRACT_SCALAR(p.DATA,'$.lastName'))), "-") AS VendorName,
  IFNULL(UPPER(JSON_EXTRACT_SCALAR(prod.DATA, '$.category')), "-") AS Product,
  IFNULL(UPPER(JSON_EXTRACT_SCALAR(srv.DATA, '$.category')), "-") AS Service
FROM `roque-prod.profiles.profiles_raw_latest` p
LEFT JOIN `roque-prod.roqueprod.roque_raw_latest` prod 
  ON p.document_id = JSON_EXTRACT_SCALAR(prod.Data,'$.author')
LEFT JOIN services.services_raw_latest srv 
  ON p.document_id = JSON_EXTRACT_SCALAR(srv.Data,'$.author')
-- 可选:如果要过滤掉既无产品也无服务的记录,就保留下面的WHERE;如果要保留这类记录就删除
WHERE 
  (prod.DATA IS NOT NULL OR srv.DATA IS NOT NULL)
-- 去重处理,避免同一Vendor+Product+Service组合的重复行
DISTINCT;

关键细节说明:

  • LEFT JOIN而非JOIN:确保所有Profiles里的记录都能被保留,包括像DEF那种既没关联产品也没关联服务的条目。
  • IFNULL函数:把查询结果里的NULL值替换成你需要的"-"符号。
  • DISTINCT关键字:去除重复行,比如当一个商家同时关联多个产品和服务时,避免生成重复的组合(不需要去重的话可以删掉)。

内容的提问来源于stack exchange,提问作者bhakti vyas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:32:53