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

如何将无法共存的两条LEFT JOIN结果行合并为一行?

问题与解决思路

当前查询结果与期望目标

当前输出

user_id | country | purpose_id
2         CA       NULL
2         NULL     367
2         NG       NULL
2         NULL     368

期望输出

user_id | country | purpose_id
2         CA       367
2         NG       368

原SQL语句

SELECT
    cs.user_id,
    UPPER(country_term.slug),
    purpose_term.term_id
FROM
    wp_user_services cs
INNER JOIN wp_posts v ON
    v.ID = cs.visa_id AND v.post_status = 'publish'
INNER JOIN wp_term_relationships tr ON
    tr.object_id = v.ID
INNER JOIN wp_term_taxonomy tt ON
    tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy IN('country', 'purpose')
LEFT JOIN wp_terms country_term ON
    tt.term_id = country_term.term_id AND tt.taxonomy = 'country'
LEFT JOIN wp_terms purpose_term ON
    purpose_term.term_id = tt.term_id AND tt.taxonomy = 'purpose'
WHERE
    cs.user_id = 2;

解决方法

原SQL的问题在于,通过tt.taxonomy IN('country', 'purpose')关联后,每个分类(国家/目的)会生成独立行,导致同一签证的国家和目的被拆分到不同记录中。以下两种方法可解决该问题:

方法1:拆分查询后关联

分别提取每个签证对应的国家和目的,再与主表关联,确保同一签证的信息合并到一行:

SELECT
    cs.user_id,
    c.country,
    p.purpose_id
FROM
    wp_user_services cs
INNER JOIN wp_posts v ON
    v.ID = cs.visa_id AND v.post_status = 'publish'
-- 子查询获取每个签证的国家信息
LEFT JOIN (
    SELECT 
        tr.object_id AS visa_id,
        UPPER(t.slug) AS country
    FROM wp_term_relationships tr
    JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
    JOIN wp_terms t ON tt.term_id = t.term_id
    WHERE tt.taxonomy = 'country'
) c ON v.ID = c.visa_id
-- 子查询获取每个签证的目的ID
LEFT JOIN (
    SELECT 
        tr.object_id AS visa_id,
        t.term_id AS purpose_id
    FROM wp_term_relationships tr
    JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
    JOIN wp_terms t ON tt.term_id = t.term_id
    WHERE tt.taxonomy = 'purpose'
) p ON v.ID = p.visa_id
WHERE
    cs.user_id = 2;

方法2:条件聚合分组

通过CASE语句筛选分类,再按用户ID和签证ID分组,用MAX聚合非空值:

SELECT
    cs.user_id,
    MAX(UPPER(CASE WHEN tt.taxonomy = 'country' THEN t.slug END)) AS country,
    MAX(CASE WHEN tt.taxonomy = 'purpose' THEN t.term_id END) AS purpose_id
FROM
    wp_user_services cs
INNER JOIN wp_posts v ON
    v.ID = cs.visa_id AND v.post_status = 'publish'
INNER JOIN wp_term_relationships tr ON
    tr.object_id = v.ID
INNER JOIN wp_term_taxonomy tt ON
    tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy IN('country', 'purpose')
INNER JOIN wp_terms t ON tt.term_id = t.term_id
WHERE
    cs.user_id = 2
GROUP BY cs.user_id, v.ID;

内容的提问来源于stack exchange,提问作者James John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:28:16