Probablemente sanchy tenga razón y con programación también podrías hacerlo, pero estamos en un foro de base de datos y te daré una respuesta de base de datos, en una consulta, aunque he de añadir que no sé si será más eficiente que hacer un par de consultas y utilizar algo de programación:
Código sql:
Ver originalSELECT a.nombre, a.apellidos, ac.id, ac.actividad, ac.fecha_inicio, ac.fecha_fin
FROM alumnos a
INNER JOIN (
SELECT aa.alumno_id ID, t1.id1 ID1, t1.id2 ID2
FROM actividades_alumnos aa
INNER JOIN (
SELECT a.id id1, b.id id2
FROM actividades a
INNER JOIN actividades b
WHERE (
a.id <> b.id
)
AND (
(
b.fecha_inicio >= a.fecha_inicio
AND b.fecha_inicio <= a.fecha_fin
)
OR (
b.fecha_inicio <= a.fecha_inicio
AND b.fecha_fin > a.fecha_inicio
)
)
)t1 ON aa.actividad_id = t1.id1
OR aa.actividad_id = t1.id2
GROUP BY aa.alumno_id
HAVING COUNT( * ) >2
)t2 ON a.id = t2.ID
INNER JOIN actividades ac ON ac.id = t2.ID1
OR ac.id = t2.ID2
ORDER BY a.id, ac.fecha_inicio, ac.fecha_fin