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

关于Left Join查询结果中列值重复的技术咨询

Fixing Duplicate Rows in Your LEFT JOIN Query

Hey Jihane, let's break down why you're seeing duplicate values in your LEFT JOIN results and how to fix it.

Why Duplicates Happen

When you use LEFT JOIN with a table like offre_concurrent, if a single action record matches multiple rows in that joined table, your main action data will repeat once for each matching row in the joined table. This is standard behavior for joins, but it's rarely what you want when you're trying to get a clean list of actions.

Solutions to Fix Duplicates

1. Use DISTINCT to Remove Exact Duplicates

If all the duplicate rows are identical (including all columns in your SELECT), adding DISTINCT to your query will eliminate them:

SELECT DISTINCT
    t1.id_action, 
    DATE_FORMAT(t1.date_creation,'%d/%m/%Y à %H:%i') AS creation_action, 
    u.id_utilisateur, 
    p.genre AS genre_utilisateur, 
    p.nom, 
    av.titre_avancement, 
    b.nom_banque, 
    c.nom_courtier
FROM action AS t1 
LEFT JOIN type ON type.id_type=t1.id_type 
LEFT JOIN avancement AS av ON av.id_avancement=t1.id_avancement 
LEFT JOIN utilisateur AS u ON u.id_utilisateur=t1.id_utilisateur 
LEFT JOIN personne AS p ON p.id_personne=u.id_personne 
LEFT JOIN offre_concurrent AS oc ON oc.id_action = t1.id_action; -- Ensure your join condition is complete

Note: This only works if duplicates are exact copies. If the joined table has varying values (like different offre_concurrent entries), DISTINCT will keep those unique rows.

2. Aggregate Data with GROUP BY

If you need to retain data from the joined table but want one row per action, use aggregate functions (like GROUP_CONCAT, MAX, MIN) to combine multiple values into a single entry, then group by your main table's unique identifier (t1.id_action):

SELECT 
    t1.id_action, 
    DATE_FORMAT(t1.date_creation,'%d/%m/%Y à %H:%i') AS creation_action, 
    u.id_utilisateur, 
    p.genre AS genre_utilisateur, 
    p.nom, 
    av.titre_avancement, 
    b.nom_banque, 
    c.nom_courtier,
    -- Combine all matching offre_concurrent names into a comma-separated list
    GROUP_CONCAT(oc.nom_offre SEPARATOR ', ') AS offres_concurrentes
FROM action AS t1 
LEFT JOIN type ON type.id_type=t1.id_type 
LEFT JOIN avancement AS av ON av.id_avancement=t1.id_avancement 
LEFT JOIN utilisateur AS u ON u.id_utilisateur=t1.id_utilisateur 
LEFT JOIN personne AS p ON p.id_personne=u.id_personne 
LEFT JOIN offre_concurrent AS oc ON oc.id_action = t1.id_action
-- Group by all non-aggregated columns to avoid database errors
GROUP BY 
    t1.id_action, 
    creation_action, 
    u.id_utilisateur, 
    genre_utilisateur, 
    p.nom, 
    av.titre_avancement, 
    b.nom_banque, 
    c.nom_courtier;

This way, you keep all relevant data without repeating the main action rows.

3. Filter Joined Rows with a Subquery

If you only need a single row from the joined table (e.g., the most recent offre_concurrent entry), use a subquery to fetch only the relevant row per action before joining:

SELECT 
    t1.id_action, 
    DATE_FORMAT(t1.date_creation,'%d/%m/%Y à %H:%i') AS creation_action, 
    u.id_utilisateur, 
    p.genre AS genre_utilisateur, 
    p.nom, 
    av.titre_avancement, 
    b.nom_banque, 
    c.nom_courtier,
    oc.nom_offre
FROM action AS t1 
LEFT JOIN type ON type.id_type=t1.id_type 
LEFT JOIN avancement AS av ON av.id_avancement=t1.id_avancement 
LEFT JOIN utilisateur AS u ON u.id_utilisateur=t1.id_utilisateur 
LEFT JOIN personne AS p ON p.id_personne=u.id_personne 
LEFT JOIN (
    -- Get only the latest offre_concurrent per action (adjust the MAX condition to fit your needs)
    SELECT id_action, nom_offre
    FROM offre_concurrent
    WHERE id_offre_concurrent IN (
        SELECT MAX(id_offre_concurrent)
        FROM offre_concurrent
        GROUP BY id_action
    )
) AS oc ON oc.id_action = t1.id_action;

This ensures you only join one row per action from offre_concurrent, eliminating duplicates entirely.

First Step: Identify the Culprit

Before applying any fix, try removing joins one by one (starting with offre_concurrent) and run the query each time. When the duplicates disappear, you'll know exactly which table is causing the issue—this helps you choose the most appropriate solution.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:30:14