使用 JOIN 时重复 GROUP_CONCAT

Duplicate GROUP_CONCAT when using JOIN

我正在创建一种 geocache 团队建设系统,但我的查询遇到了问题。

为了对照我正在使用的团队整理和显示个人 GROUP_CONCAT,但是当我尝试包含位置(列为 markers)时,个人名称会根据标记数。

我整理了一个 SQL Fiddle 来解释我的工作原理。

这是我的查询:

SELECT SQL_CALC_FOUND_ROWS
            map_team.id AS team_id,
            map_team.name,
            GROUP_CONCAT(firstname, ' ', surname SEPARATOR ', ') AS full_name
            FROM map_team
            LEFT JOIN members
                ON members.map_team=map_team.id
            WHERE members.map_team IS NOT NULL
            GROUP BY map_team.name
            ORDER BY map_team.name ASC

如有任何建议,我们将不胜感激。

使用

GROUP_CONCAT(distinct firstname ...

使用以下查询:

SELECT SQL_CALC_FOUND_ROWS
    map_team.id AS team_id,
    map_team.name,
    GROUP_CONCAT(distinct firstname, ' ', surname SEPARATOR ', ') AS full_name,
    count(*) AS total_markers,
    SUM(IF(status = 'completed', 1, 0)) AS total_completed
    FROM map_team
    LEFT JOIN members
        ON members.map_team=map_team.id
    LEFT JOIN map_markers
        ON map_markers.team_id=map_team.id
    WHERE members.map_team IS NOT NULL
    GROUP BY map_team.name
    ORDER BY map_team.name ASC

GROUP_CONCAT( distinct ... ) 不会给出正确答案,因为团队中的团队成员姓名可以相同。如果您想在单个查询中获取它,您可以使用:

SELECT SQL_CALC_FOUND_ROWS
    map_team.id AS team_id,
    map_team.name,
    GROUP_CONCAT(firstname, ' ', surname SEPARATOR ', ') AS full_name,
    (select count(*) from map_markers where team_id = map_team.id) AS total_markers,
    (select count(*) from map_markers where team_id = map_team.id and status = 'completed') AS total_completed
    FROM map_team
    LEFT JOIN members
        ON members.map_team=map_team.id
    WHERE members.map_team IS NOT NULL
    GROUP BY map_team.name
    ORDER BY map_team.name ASC

如果您不喜欢 select 中的子查询的想法。您需要单独进行。