domingo, 17 de octubre de 2010

Practicando SQL (Parte 4)

Te encuentras en la cuarta parte de la serie "Practicando SQL":
  1. Configurando ambiente de trabajo y consultas básicas
  2. Consultas con más de una tabla
  3. Consultas con agrupados
  4. Consultas anidadas

Supongamos que deseamos saber con cuáles actores han trabajado con cierto actor (en este ejemplo usaremos al actor Christopher West que tiene como actor_id = 163). Para ello, primero debemos obtener una lista de todos los films en los que ha trabajado Christopher. De esta lista de films, obtendremos todos los actores que han trabajado en esos films (y por lo tanto han trabajado con Christopher). Un detalle que hay que cuidar, es que un actor puede aparecer más de una vez, por lo que sólo hay que mostrarlo una vez.

La siguiente consulta regresa todos los films en los que ha trabajado Christopher:

mysql> SELECT film_id
  -> FROM film_actor
  -> WHERE actor_id=163;

Ahora podemos obtener los actores que han trabajado en esas películas con:

mysql> SELECT actor.actor_id, first_name, last_name
  -> FROM actor
  ->   INNER JOIN film_actor ON (actor.actor_id=film_actor.actor_id)
  -> WHERE film_id IN
  -> (SELECT film_id FROM film_actor WHERE actor_id=163);

Como pueden ver las primeras tres filas de la consulta ya son familiares: obtienen en qué películas han trabajado todos los actores. La última fila (consulta anidada) es igual a la primer consulta mostrada arriba. El truco es que usamos los resultados de la consulta anidada para mostrar sólo los actores que hayan participado en esos films. También noten que usamos la palabra clave IN, ya que podemos tener más de una película. Podemos leer las últimas dos líneas de la consulta como: si el film_id de la fila de la consulta externa se encuentra en la lista de films regresados por la consulta interna, entonces esa fila pertenece al resultado final.

Como Christopher pudo haber trabajado en más de una película con el mismo actor, esto causa actores repetidos en el resultado. Eso lo podemos solucionar fácilmente usando la palabra clave DISTINCT. Además, la siguiente consulta también excluye al mismo Christopher.

mysql> SELECT DISTINCT actor.actor_id, first_name, last_name
   -> FROM actor
   ->   INNER JOIN film_actor ON (actor.actor_id=film_actor.actor_id)
   -> WHERE actor.actor_id<>163 AND film_id IN
   -> (SELECT film_id FROM film_actor WHERE actor_id=163);

Muy bien! Con esto cerramos esta introducción a SQL. Sin embargo, de vez en cuando publicaré alguna consulta que resulte interesante. Por último los dejo con una trivia.

Trivia

Requisitos para participar

  1. Ser seguidor de este blog
  2. Ser estudiante del Instituto Tecnológico de Toluca (credencial vigente)
  3. Poner la respuesta en los comentarios de este post
  4. Fecha límite: 31 de Octubre de 2010 a las 23:59:59

Premio

Un mouse que se encuentra en muy buenas condiciones. Es similar al que pueden ver aquí. El ganador será el primer comentario con la respuesta correcta.

Pregunta

Mostrar la consulta y el resultado que obtenga el par de actores que han trabajado en más films juntos. Por ejemplo, quizá Cristopher y Bela Walken han trabajado en 50 films. La consulta debe regresar a los dos actores y el número de films. NOTA: Cristopher no es necesariamente parte de la respuesta, puede ser cualquier par de actores.

La respuesta a la trivia la puedes encontrar en el siguiente post.

3 comentarios:

  1. si me pueden ayudar en una tarea me pide:
    Listar al cliente y cuantas veces alquilo un tipo de pelicula

    ResponderEliminar
  2. Respuestas
    1. Nos da mucho gusto saber que fue de ayuda. Gracias por comentar.

      Eliminar