hola,
Disculpe por hacerle caer en un error, no preví el producto cartesiano entre
todos y
ellos.
Para arreglarlo, haría lo siguiente:
1. Crear una vista con los usuarios de los ejercicios en común:
Código SQL
[-]CREATE VIEW algunos AS
SELECT
yo.idusuario yo_idusuario,
ellos.idusuario ellos_idusuario,
ellos.idejercicio ellos_idejercicio
FROM evaluacion yo
INNER JOIN evaluacion ellos
ON yo.idejercicio = ellos.idejercicio
and yo.idusuario <> ellos.idusuario
2. Usar esa vista para filtrar aparte usuarios y aparte ejercicios:
Código SQL
[-]SELECT DISTINCT
todos.idusuario, todos.idejercicio
FROM evaluacion todos
INNER JOIN algunos
ON todos.idusuario = algunos.ellos_idusuario
AND algunos.yo_idusuario = :miusuario
WHERE NOT todos.idejercicio IN (
SELECT DISTINCT ellos_idejercicio
FROM algunos
WHERE yo_idusuario = :miusuario
)
ORDER BY
todos.idusuario, todos.idejercicio
3. La misma consulta anterior, pero con mejor plan de ejecución:
Código SQL
[-]SELECT
todos.idusuario, todos.idejercicio
FROM evaluacion todos
INNER JOIN (
SELECT DISTINCT ellos_idusuario
FROM algunos
WHERE yo_idusuario = :miusuario
) algunos
ON todos.idusuario = algunos.ellos_idusuario
WHERE NOT todos.idejercicio IN (
SELECT DISTINCT ellos_idejercicio
FROM algunos
WHERE yo_idusuario = :miusuario
)
ORDER BY
todos.idusuario, todos.idejercicio
Las dos consultas fueron probadas en ~
http://sqlfiddle.com/#!9/a4938/2
-