Ver Mensaje Individual
  #7  
Antiguo 29-07-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Reputación: 17
TOPX Va camino a la fama
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

-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita