DROP TABLE UTENTI;
DROP TABLE POST;
DROP TABLE LIKE;

CREATE TABLE UTENTI (
	USERNAME CHAR(10) NOT NULL PRIMARY KEY,
	NOME 	 VARCHAR(20) NOT NULL,
	COGNOME  VARCHAR(20) NOT NULL,
	DATAREGISTRAZIONE DATE NOT NULL	);

CREATE TABLE POST (
	PID 	INT NOT NULL PRIMARY KEY CHECK (PID > 0),
	USER 	CHAR(10) NOT NULL REFERENCES UTENTI,
	DATA 	DATE NOT NULL,
	TESTO 	VARCHAR(50) NOT NULL		);

CREATE TABLE LIKE(
	USER 	CHAR(10) NOT NULL REFERENCES UTENTI,
	PID 	INT NOT NULL REFERENCES POST,
	DATA 	DATE NOT NULL,
	PRIMARY KEY (USER,PID)				);


INSERT INTO UTENTI VALUES
('Il rosso','Marco','Rossi','24/11/2017'),
('Il verde','Luca','Verdi','26/11/2017'),
('Il bianco','Massimo','Bianchi','15/01/2018'),
('La nera','Anna','Neri','19/01/2018')
;

INSERT INTO POST VALUES
(1001,'Il rosso','02/12/2017','quasi ora di pranzo...'),
(1002,'Il rosso','03/12/2017','c''e'' nessuno?'),
(1003,'Il verde','03/12/2017','eccomi, come va?' ),
(1004,'Il rosso','03/12/2017','insomma, e tu?' ),
(1005,'Il verde','03/12/2017','io bene, studio a parte' ),

(1027,'Il bianco','15/01/2018','un saluto a tutti!' ),
(1028,'Il rosso','15/01/2018','benvenuto!' ),
(1029,'Il verde','16/01/2018','wow, siamo in 3!!!' ),

(1040,'La nera','19/01/2018','Ci sono anch''io!' ),
(1041,'Il verde','19/01/2018','wow, addirittura 4!!!' ),
(1042,'Il bianco','19/01/2018','benvenuta' ),
(1043,'La nera','19/01/2018','grazie :)' )

;

INSERT INTO LIKE VALUES
('Il rosso',1003,'03/12/2017'),
('Il rosso',1005,'04/12/2017'),
('Il rosso',1027,'15/01/2018'),
('Il rosso',1029,'17/01/2018'),
('Il rosso',1040,'19/01/2018'),
('Il rosso',1041,'20/01/2018'),

('Il verde',1002,'03/12/2017'),
('Il verde',1027,'16/01/2018'),
('Il verde',1040,'19/01/2018'),

('Il bianco',1028,'16/01/2018'),
('Il bianco',1029,'17/01/2018'),
('Il bianco',1040,'20/01/2018'),
('Il bianco',1041,'21/01/2018'),

('La nera',1001,'19/01/2018'),
('La nera',1005,'19/01/2018'),
('La nera',1027,'19/01/2018'),
('La nera',1041,'19/01/2018'),
('La nera',1042,'19/01/2018')
;

-- 2.1
SELECT 	P.PID, (DAYS(MAX(L.Data)) - DAYS(P.Data)) AS NumGiorni
FROM   	POST P, LIKE L
WHERE	P.PID = L.PID
GROUP BY P.PID, P.Data;


-- 2.2
WITH 
NUM_POST (UPosts, NumPosted) AS (
SELECT P.User, COUNT(*) 
	FROM	 POST P 
	GROUP BY P.User 		),

NUM_LIKES (ULikes,UPosts,NumLiked) AS (
	SELECT 	L.User, P.User, COUNT(*) 
	FROM	POST P, LIKE L
	WHERE 	P.PID = L.PID
	GROUP BY L.User, P.User	)

SELECT 	NL.*
FROM	NUM_LIKES NL
WHERE	NL.NumLiked = ( SELECT 	NP.NumPosted
		 	FROM	NUM_POST NP
			WHERE  	NP.UPosts = NL.UPosts );




GRANT SELECT ON UTENTI TO PUBLIC;
GRANT SELECT ON POST TO PUBLIC;
GRANT SELECT ON LIKE TO PUBLIC;

