Last active
December 26, 2023 00:07
-
-
Save felipejoq/c8e9922ec5326b33428abb69ca0f77cf to your computer and use it in GitHub Desktop.
Desafio III - SQL: Consulta a múltiples tablas
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- ##### CREACIÓN DE LA BASE DE DATOS: | |
CREATE DATABASE desafio3_felipe_jofre_000; | |
-- Para usar la base de datos utilizar comando: | |
-- \c desafio3_felipe_jofre_000 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 1. Crea y agrega al entregable las consultas para completar | |
-- el setup de acuerdo a lo pedido. | |
-- ##### DESARROLLO DEL SETUP | |
-- TABLA para usuarios: | |
CREATE TABLE IF NOT EXISTS | |
usuarios ( | |
id SERIAL PRIMARY KEY, | |
rol VARCHAR DEFAULT 'usuario' CHECK (rol IN ('administrador', 'usuario')) NOT NULL, | |
email VARCHAR NOT NULL, | |
nombre VARCHAR NOT NULL, | |
apellido VARCHAR NOT NULL | |
); | |
-- INSERSIONES TABLA usuarios: | |
INSERT INTO | |
usuarios (rol, email, nombre, apellido) | |
VALUES | |
('administrador', '[email protected]', 'Felipe', 'Jofré'), | |
('usuario', '[email protected]', 'Antonio', 'Rivera'), | |
('usuario', '[email protected]', 'Jane', 'Loto'), | |
('usuario', '[email protected]', 'María', 'López'), | |
('usuario', '[email protected]', 'Roberto', 'Troncoso'); | |
-- TABLA para posts: | |
CREATE TABLE IF NOT EXISTS | |
posts ( | |
id SERIAL PRIMARY KEY, | |
fecha_creacion TIMESTAMP NOT NULL DEFAULT NOW (), | |
fecha_actualizacion TIMESTAMP, | |
destacado BOOLEAN DEFAULT false NOT NULL, | |
titulo VARCHAR, | |
contenido TEXT, | |
usuario_id BIGINT, | |
CONSTRAINT fk_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios (id) | |
); | |
-- INSERSIONES TABLA posts: | |
INSERT INTO | |
posts (fecha_creacion, fecha_actualizacion, destacado, titulo, contenido, usuario_id) | |
VALUES | |
('2023-12-01', NULL, true, '01 Lorem ipsum dolor sit amet', '01 Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...', 1), | |
('2023-12-05', NULL, false, '02 Lorem ipsum dolor sit amet', '02 Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...', 1), | |
('2023-12-11', NULL, false, '03 Lorem ipsum dolor sit amet', '03 Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...', 2), | |
('2023-12-15', NULL, false, '04 Lorem ipsum dolor sit amet', '04 Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...', 3), | |
('2023-12-19', NULL, false, '05 Lorem ipsum dolor sit amet', '05 Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...', NULL); | |
-- TABLA para comentarios: | |
CREATE TABLE IF NOT EXISTS | |
comentarios ( | |
id SERIAL PRIMARY KEY, | |
fecha_creacion TIMESTAMP DEFAULT NOW(), | |
usuario_id BIGINT, | |
post_id BIGINT, | |
contenido TEXT NOT NULL, | |
CONSTRAINT fk_usuario | |
FOREIGN KEY (usuario_id) | |
REFERENCES usuarios(id), | |
CONSTRAINT fk_post | |
FOREIGN KEY (post_id) | |
REFERENCES posts(id) | |
); | |
-- INSERSIONES TABLA comentarios: | |
INSERT INTO | |
comentarios (fecha_creacion, usuario_id, post_id, contenido) | |
VALUES | |
('2023-12-01', 1, 1, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do'), | |
('2023-12-05', 2, 1, 'consectetur adipiscing elit, sed do'), | |
('2023-12-11', 3, 1, 'sit amet, consectetur adipisci'), | |
('2023-12-15', 1, 2, 'consectetur adipiscing elit'), | |
('2023-12-19', 2, 2, 'psum dolor sit amet, consectetur adipiscing elit, sed d'); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- #### DESARROLLO DE LAS CONSULTAS | |
-- 2. Cruza los datos de la tabla usuarios y posts, mostrando las siguientes columnas: | |
-- nombre y email del usuario junto al título y contenido del post. | |
SELECT u.nombre, u.email, p.titulo, p.contenido | |
FROM usuarios AS u | |
INNER JOIN posts AS p | |
ON u.id = p.usuario_id; | |
-- 3. Muestra el id, título y contenido de los posts de los administradores. | |
-- a). El administrador puede ser cualquier id. | |
SELECT p.id, p.titulo, p.contenido, u.nombre AS autor, u.rol | |
FROM usuarios AS u | |
INNER JOIN posts AS p | |
ON u.id = p.usuario_id | |
WHERE u.id = (SELECT id FROM usuarios WHERE rol = 'administrador'); | |
-- 4. Cuenta la cantidad de posts de cada usuario. | |
-- a). La tabla resultante debe mostrar el id e email del usuario junto con la | |
-- cantidad de posts de cada usuario. | |
SELECT u.id, u.email, COUNT(p.id) as cantidad_posts | |
FROM usuarios AS u | |
INNER JOIN posts AS p | |
ON u.id = p.usuario_id | |
GROUP BY u.id, u.email | |
ORDER BY cantidad_posts DESC; | |
-- 5. Muestra el email del usuario que ha creado más posts. | |
-- a). Aquí la tabla resultante tiene un único registro y muestra solo el email. | |
SELECT u.id, u.email, COUNT(p.id) as cantidad_posts | |
FROM usuarios AS u | |
INNER JOIN posts AS p | |
ON u.id = p.usuario_id | |
GROUP BY u.id, u.email | |
ORDER BY cantidad_posts DESC | |
LIMIT 1; | |
-- 6. Muestra la fecha del último post de cada usuario. | |
SELECT u.nombre AS autor, p.titulo, p.fecha_creacion | |
FROM usuarios AS u | |
INNER JOIN posts AS p | |
ON u.id = p.usuario_id; | |
-- 7. Muestra el título y contenido del post (artículo) con más comentarios | |
SELECT p.titulo, p.contenido, count(c.id) AS cantidad_comentarios | |
FROM posts AS p | |
INNER JOIN comentarios AS c | |
ON p.id = c.post_id | |
GROUP BY p.id | |
ORDER BY COUNT(*) DESC | |
LIMIT 1; | |
-- 8. Muestra en una tabla el título de cada post, el contenido de cada | |
-- post y el contenido de cada comentario asociado a los posts mostrados, | |
-- junto con el email delusuario queloescribió. | |
SELECT p.titulo, p.contenido, c.contenido, u.email | |
FROM posts AS p | |
INNER JOIN comentarios AS c | |
ON p.id = c.post_id | |
INNER JOIN usuarios AS u | |
ON c.usuario_id = u.id; | |
-- 9. Muestra el contenido del último comentario de cada usuario. | |
SELECT DISTINCT ON (u.email) | |
u.email, | |
c.fecha_creacion, | |
c.contenido | |
FROM usuarios u | |
INNER JOIN comentarios c | |
ON u.id = c.usuario_id | |
ORDER BY u.email, c.fecha_creacion DESC; | |
-- 10. Muestra los emails de los usuarios que no han escrito ningún comentario | |
SELECT u.email | |
FROM usuarios u | |
LEFT JOIN comentarios c | |
ON u.id = c.usuario_id | |
WHERE c.id IS NULL; | |
-- NOTA I: Luego de crear la base de datos debe conectarse a ella usando el comando \c desafio3_felipe_jofre_000 | |
-- Nota II: Desarrollado por Felipe Jofré. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment