-- "un n-uplet contenant le nombre de joueurs, le nombre d’équipes, le nombre de classements, le nombre de
-- 	tournois et la moyenne des participants par tournoi".
SELECT (
	SELECT COUNT(*) FROM joueur 
) AS nb_joueurs,
(
	SELECT COUNT(*) FROM equipe 
) AS nb_equipes,
(
	SELECT COUNT(*) FROM classement 
) AS nb_classements,
(
	SELECT COUNT(*) FROM tournoi 
) AS nb_tournois,
(
	WITH participants_tournois AS
		(SELECT idtournoi, COUNT(idtournoi) AS nb FROM participe GROUP BY idtournoi)
 	SELECT AVG(nb) AS average FROM participants_tournois
) AS moyenne_participants;





-- "les phases de tournoi (nom et année de tournoi, niveau de phase) jouées et pour lesquelles s’est qualifié
-- 	l’utilisateur courant. Le résultat sera trié sur les années selon l’ordre antéchronologique puis sur les niveaux
-- 	de phase selon l’ordre lexicographique inverse".
SELECT T.nom, YEAR(T.date_deb), niveau 
FROM participe Pa 
	JOIN phase Ph USING(idtournoi, niveau) 
	JOIN tournoi T USING(idtournoi) 
WHERE Pa.idjoueur = ? AND Pa.est_qualifie AND Pa.a_joue
ORDER BY T.date_deb DESC, Ph.niveau DESC;





--"le nombre d’équipes classées premières des classements et dont aucun des membres n’est premier dans
--	un classement individuel".
WITH equipes_top_1 AS 
	(SELECT idequipe FROM classement_equipe WHERE rang = 1)

, equipes_avec_bon_joueur AS
	(SELECT DISTINCT idequipe FROM classement_individuel JOIN joueur USING(idjoueur) WHERE rang = 1)

SELECT COUNT(*) AS nb_equipes FROM equipes_top_1 ET1 WHERE NOT EXISTS (SELECT * FROM equipes_avec_bon_joueur EBJ WHERE ET1.idequipe = EBJ.idequipe);





-- "Pour les 3 dernières années, donner le nombre moyen de participants aux tournois".
WITH participants_tournois AS 
(SELECT idtournoi, COUNT(idtournoi) AS nb 
		FROM participe 
		JOIN tournoi USING(idtournoi) 
			WHERE YEAR(date_deb) >= (YEAR(NOW()) - 3) 
		GROUP BY idtournoi)
	SELECT AVG(nb) AS average FROM participants_tournois





-- "Donner le nom et le prénom des joueurs classés de manière individuelle dans le top 5 d’au moins 2
--	classements de portée nationale".
SELECT DISTINCT J.nom, J.prenom FROM joueur J 
    JOIN classement_individuel CI1 ON J.idjoueur = CI1.idjoueur
    JOIN classement_individuel CI2 ON J.idjoueur = CI2.idjoueur
    JOIN classement C1 ON C1.idclassement = CI1.idclassement
    JOIN classement C2 ON C2.idclassement = CI2.idclassement
	WHERE CI1.rang <= 5 AND CI2.rang <= 5 
		AND C1.portee = "nationale" AND C2.portee = "nationale"
		AND CI1.idclassement < CI2.idclassement;





-- "Pour chaque taille de plateau, donner le nombre de parties jouées avec un plateau de cette taille".
SELECT taille, COUNT(idpartie) AS nb_parties 
	FROM plateau JOIN partie USING(idplateau)
	GROUP BY taille;





-- "Le top 5 des joueurs (pseudo) qui ont joué le plus de parties"
WITH top_players AS
	(SELECT pseudo, COUNT(idPartie) AS nb_parties FROM joueur JOIN joue USING(idjoueur) GROUP BY idjoueur ORDER BY nb_parties DESC)
    
SELECT pseudo FROM top_players LIMIT 5;
