Это вторая попытка ответить на этот вопрос, упрощая его просто для подсчета отдельных клубов, а не для составления списка названий клубов.
SELECT p.surname, r.start_date, r.end_date, COUNT(DISTINCT c.id) AS counter
FROM ejl_players p
JOIN ejl_registration r ON (r.player_id = p.id)
JOIN ejl_teams t ON (r.team_id = t.id)
JOIN ejl_clubs c ON (t.club_id = c.id)
WHERE r.season = '2008'
GROUP BY p.id
HAVING counter > 1;
Обратите внимание, что, поскольку вы используете MySQL, вы можете быть довольно гибкими в отношении столбцов в списке выбора, не соответствующих столбцам в предложении GROUP BY. Другие бренды РСУБД более строго относятся к правилу единой стоимости.
Нет причин использовать левое соединение, как в вашем примере.
Хорошо, вот первая версия запроса:
У вас есть цепочка отношений, подобная следующей:
club1 <-- team1 <-- reg1 --> player <-- reg2 --> team2 --> club2
Так что club1 не должен совпадать с club2.
SELECT p.surname,
CONCAT_WS(',', GROUP_CONCAT(DISTINCT t1.team_name),
GROUP_CONCAT(DISTINCT t2.team_name)) AS teams,
CONCAT_WS(',', GROUP_CONCAT(DISTINCT c1.short_name),
GROUP_CONCAT(DISTINCT c2.short_name)) AS clubs
FROM ejl_players p
-- Find a club where this player is registered
JOIN ejl_registration r1 ON (r1.player_id = p.id)
JOIN ejl_teams t1 ON (r1.team_id = t1.id)
JOIN ejl_clubs c1 ON (t1.club_id = c1.id)
-- Now find another club where this player is registered in the same season
JOIN ejl_registration r2 ON (r2.player_id = p.id AND r1.season = r2.season)
JOIN ejl_teams t2 ON (r2.team_id = t2.id)
JOIN ejl_clubs c2 ON (t2.club_id = c2.id)
-- But the two clubs must not be the same (use < to prevent duplicates)
WHERE c1.id < c2.id
GROUP BY p.id;