Otro ejercicio más de SQL
Publicado: Sab Nov 05, 2011 8:05 pm
Para los que no lo sepan, la Universidad de Stanford está dando un curso on line de Introducción a las bases de datos. Cada semana hay que entregar una serie de ejercicios y esta semana me encontré con uno que me hizo pensar bastante.
Primero pondré la estructura de la base de datos.
Son tres tablas, una de alumnos (Highschooler), una de amigos (Friend) y una de "se gustan" (Likes). Si dos personas son amigos entonces hay 2 entradas en la tabla Friend, A-B y B-A. Si, en cambio, 2 personas se gustan, no necesariamente existen 2 entradas porque A puede gustar de B y no darse el caso contrario (me hace acordar a mi adolescencia, me gustaban todas y ninguna me daba bola ).
También puede darse el caso de que A guste de B y que no sean amigos.
El ejercicio consiste en lo siguiente:
Por cada estudiante A al que le gusta B donde los dos no son amigos, encontrar si tienen un amigo C en común (quien puedo presentarlos).
Para esos tríos, retornar nombre y grado de A, B y C.
La solución que encontré me parece algo complicado (y probablemente redundante en algunos campos) así que espero que encuentren algo uds. Luego comparamos.
Saludos.
Primero pondré la estructura de la base de datos.
Código: Seleccionar todo
/* Delete the tables if they already exist */
drop table if exists Highschooler;
drop table if exists Friend;
drop table if exists Likes;
/* Create the schema for our tables */
create table Highschooler(ID int, name text, grade int);
create table Friend(ID1 int, ID2 int);
create table Likes(ID1 int, ID2 int);
/* Populate the tables with our data */
insert into Highschooler values (1510, 'Jordan', 9);
insert into Highschooler values (1689, 'Gabriel', 9);
insert into Highschooler values (1381, 'Tiffany', 9);
insert into Highschooler values (1709, 'Cassandra', 9);
insert into Highschooler values (1101, 'Haley', 10);
insert into Highschooler values (1782, 'Andrew', 10);
insert into Highschooler values (1468, 'Kris', 10);
insert into Highschooler values (1641, 'Brittany', 10);
insert into Highschooler values (1247, 'Alexis', 11);
insert into Highschooler values (1316, 'Austin', 11);
insert into Highschooler values (1911, 'Gabriel', 11);
insert into Highschooler values (1501, 'Jessica', 11);
insert into Highschooler values (1304, 'Jordan', 12);
insert into Highschooler values (1025, 'John', 12);
insert into Highschooler values (1934, 'Kyle', 12);
insert into Highschooler values (1661, 'Logan', 12);
insert into Friend values (1510, 1381);
insert into Friend values (1510, 1689);
insert into Friend values (1689, 1709);
insert into Friend values (1381, 1247);
insert into Friend values (1709, 1247);
insert into Friend values (1689, 1782);
insert into Friend values (1782, 1468);
insert into Friend values (1782, 1316);
insert into Friend values (1782, 1304);
insert into Friend values (1468, 1101);
insert into Friend values (1468, 1641);
insert into Friend values (1101, 1641);
insert into Friend values (1247, 1911);
insert into Friend values (1247, 1501);
insert into Friend values (1911, 1501);
insert into Friend values (1501, 1934);
insert into Friend values (1316, 1934);
insert into Friend values (1934, 1304);
insert into Friend values (1304, 1661);
insert into Friend values (1661, 1025);
insert into Friend select ID2, ID1 from Friend;
insert into Likes values(1689, 1709);
insert into Likes values(1709, 1689);
insert into Likes values(1782, 1709);
insert into Likes values(1911, 1247);
insert into Likes values(1247, 1468);
insert into Likes values(1641, 1468);
insert into Likes values(1316, 1304);
insert into Likes values(1501, 1934);
insert into Likes values(1934, 1501);
insert into Likes values(1025, 1101);
También puede darse el caso de que A guste de B y que no sean amigos.
El ejercicio consiste en lo siguiente:
Por cada estudiante A al que le gusta B donde los dos no son amigos, encontrar si tienen un amigo C en común (quien puedo presentarlos).
Para esos tríos, retornar nombre y grado de A, B y C.
La solución que encontré me parece algo complicado (y probablemente redundante en algunos campos) así que espero que encuentren algo uds. Luego comparamos.
Saludos.