alanezz / Syllabus-2019-1

26 stars 13 forks source link

Pregunta 6 ayudantía 2 #29

Closed gnacrur closed 5 years ago

gnacrur commented 5 years ago

Para la pregunta 6 la solución de la ayudantía fue la siguiente:

CREATE VIEW Partidas_Juegos (jid, nombre, partidas) AS
SELECT J.jid, J.nombre, COUNT(P.pid)
FROM Juegos J, Partidas P
WHERE J.jid = P.jid
GROUP BY J.jid, J.nombre

SELECT PJ.nombre
FROM Partidas_Juegos PJ
WHERE ALL
(SELECT *
FROM Partidas_Juegos PJ2
WHERE PJ.partidas >= PJ2.partidas)

Me gustaría saber si funcionaría lo siguiente o sino porque no sirve:

CREATE VIEW Partidas_Juegos (nombre, partidas) AS
SELECT  J.nombre, COUNT( * )
FROM Juegos J, Partidas P
WHERE J.jid = P.jid
GROUP BY J.jid

SELECT PJ.nombre
FROM Partidas_Juegos PJ
WHERE  PJ.partidas > ALL
(SELECT PJ.partidas
FROM Partidas_Juegos PJ2)

Donde los cambios que importantes son el * del COUNT, que en group by no puse J.nombre y que no hice WHERE ALL sino que comparé las partidas con toda la tabla anidada.

naquiroz commented 5 years ago

Hasta donde yo se, creo que el resultado es el mismo 😀. ~Quizás solo hay un tema en poner el asterisco en vez de sólo el P.pid 🤔, dado que poner el * implica contar todas las filas distintas (agrupadas por jid y nombre), y eso puede contar más filas que contar solo las filas que tienen un pid distinto~ es lo mismo 😁.

TamaraCucumides commented 5 years ago

Hola, en el primer caso, al no hacer GROUP BY por el nombre, no puedes seleccionar el nombre (en general no puedes seleccionar columnas que no estén dentro del group by).

Con respecto a la diferencia entre el *COUNT( ) y el COUNT(P.pid) en este caso* es lo mismo, puesto que COUNT( ) cuenta filas y como el pid es KEY, contar las filas será equivalente a contar los pid (dado que cada fila tiene un pid).

Para complementar: La única manera que un COUNT(columna) sea distinto a un *COUNT( )** es que algunas filas no posean el atributo columna (es decir, que tengan nulo en esa columna) y en ese caso esa fila no se cuenta.

Finalmente, si quisieramos contar, por ejemplo, todos los nombres distintos de juegos, para asegurarnos de que no cuente los repetidos, debemos hacer COUNT(DISTINTC nombre).