使用 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 中的子查询的想法。您需要单独进行。
我正在创建一种 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 中的子查询的想法。您需要单独进行。