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
相关产品推荐
相关产品推荐

