MySQL: Consultas SQL para al menos participar en todos los eventos de un usuario específico

En SQL, las subconsultas con NOT EXISTS son útiles para resolver problemas que requieren doble negación, como encontrar objetos que hayan participado en todos los eventos donde un usuario particular participó. La lógica se basa en que NOT EXISTS devuelve true cuando no existen registros que no cumplan una condición, lo que equivale a una afirmación al negar la negación.

Por ejemplo, para identificar clientes que hayan comprado todos los productos, no se puede usar EXISTS directamente, ya que este termina al encontrar cualquier coincidencia. En cambio, se emplea NOT EXISTS para detectar usuarios que no compraron todos los productos, y luego se aplica otro NOT EXISTS externo para invertir el resultado y obtener aquellos que sí lo hicieron.

Consideremos un escenario concreto: hallar los participantes que hayan competido en todas las competencias donde el usuario con ID '789012' participó. Primero, se filtran las competencias de este usuario de la tabla de inscripciones, asegurando que el identificador de competencia no sea nulo.

SELECT *
FROM inscripciones AS i
WHERE i.participante_id = '789012' AND i.competencia_id IS NOT NULL;

Este conjunto inicial se utiliza en una subconsulta anidada para verificar si otros participantes están inscritos en todas esas competencias. La consulta completa emplea dos niveles de NOT EXISTS: el interno detecta competencias faltantes para un participante, y el externo excluye a aquellos que tengan alguna competencia no cubierta.

SELECT DISTINCT p.*
FROM participantes AS p
WHERE NOT EXISTS (
    SELECT 1
    FROM inscripciones AS i
    WHERE i.participante_id = '789012' AND i.competencia_id IS NOT NULL
    AND NOT EXISTS (
        SELECT 1
        FROM inscripciones AS j
        WHERE p.id = j.participante_id AND i.competencia_id = j.competencia_id
    )
);

Otro caso práctico involucra proveeedores y piezas: determinar los proyectos que usaron todas las piezas suministradas por el proveedor 'S3'. Se comienza seleccionando las piezas de este proveedor en la tabla de suministros.

SELECT *
FROM suministros AS s
WHERE s.proveedor_id = 'S3';

Luego, se aplica la misma estructura de doble negación para encontrar proyectos que incluyan todas esas piezas. La subconsulta interna verifica la presencia de cada pieza del proveedor en los suministros del proyecto, mientras que la externa garantiza que no haya piezas faltantes.

SELECT DISTINCT pro.proyecto_id
FROM proyectos AS pro
WHERE NOT EXISTS (
    SELECT 1
    FROM suministros AS s
    WHERE s.proveedor_id = 'S3'
    AND NOT EXISTS (
        SELECT 1
        FROM suministros AS t
        WHERE pro.proyecto_id = t.proyecto_id AND s.pieza_id = t.pieza_id
    )
);

En estos ejemplos, es crucial manejar correctamente los valores nulos, ya que NOT EXISTS los trata como existentes, lo que podría afectar los resultados. La clave está en definir adecuadamente el conjunto de referencia en la subconsulta y aplicar las condiciones de filtrado iniciales antes de la verificación de totalidad.

Etiquetas: MySQL SQL NOT EXISTS subconsultas anidadas consultas de usuario

Publicado el 6-26 05:55