Update SQL views

This commit is contained in:
2024-04-12 13:24:08 +02:00
parent 4ee48b93bc
commit 2a35d0289f

View File

@@ -1,83 +1,213 @@
-- "un n-uplet contenant le nombre de joueurs, le nombre déquipes, le nombre de classements, le nombre de -- "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". -- tournois et la moyenne des participants par tournoi".
CREATE VIEW stat_globales AS SELECT ( CREATE VIEW
SELECT COUNT(*) FROM joueur stat_globales AS
) AS nb_joueurs, SELECT
( (
SELECT COUNT(*) FROM equipe SELECT
) AS nb_equipes, COUNT(*)
( FROM
SELECT COUNT(*) FROM classement joueur
) AS nb_classements, ) AS nb_joueurs,
( (
SELECT COUNT(*) FROM tournoi SELECT
) AS nb_tournois, COUNT(*)
( FROM
WITH participants_tournois AS equipe
(SELECT idtournoi, COUNT(idtournoi) AS nb FROM participe GROUP BY idtournoi) ) AS nb_equipes,
SELECT AVG(nb) AS average FROM participants_tournois (
) AS moyenne_participants; 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;
-- "le nombre déquipes classées premières des classements et dont aucun des membres nest premier dans -- "le nombre déquipes classées premières des classements et dont aucun des membres nest premier dans
-- un classement individuel". -- un classement individuel".
CREATE VIEW equipes_top_1 AS CREATE VIEW
(SELECT idequipe FROM classement_equipe WHERE rang = 1); equipes_top_1 AS (
SELECT
CREATE VIEW equipes_avec_bon_joueur AS idequipe
(SELECT DISTINCT idequipe FROM classement_individuel JOIN joueur USING(idjoueur) WHERE rang = 1); FROM
classement_equipe
WHERE
rang = 1
);
CREATE VIEW
equipes_avec_bon_joueur AS (
SELECT DISTINCT
idequipe
FROM
classement_individuel
JOIN joueur USING (idjoueur)
WHERE
rang = 1
);
-- "Pour les 3 dernières années, donner le nombre moyen de participants aux tournois". -- "Pour les 3 dernières années, donner le nombre moyen de participants aux tournois".
CREATE VIEW participants_tournois_recents AS CREATE VIEW
(SELECT idtournoi, COUNT(idtournoi) AS nb participants_tournois_recents AS (
FROM participe SELECT
JOIN tournoi USING(idtournoi) idtournoi,
WHERE YEAR(date_deb) >= (YEAR(NOW()) - 3) COUNT(idtournoi) AS nb
GROUP BY idtournoi); FROM
participe
JOIN tournoi USING (idtournoi)
WHERE
YEAR (date_deb) >= (YEAR (NOW ()) - 3)
GROUP BY
idtournoi
);
-- "Donner le nom et le prénom des joueurs classés de manière individuelle dans le top 5 dau moins 2 -- "Donner le nom et le prénom des joueurs classés de manière individuelle dans le top 5 dau moins 2
-- classements de portée nationale". -- classements de portée nationale".
CREATE VIEW joueurs_au_moins_deux_top_5 AS CREATE VIEW
(SELECT DISTINCT J.nom, J.prenom FROM joueur J joueurs_au_moins_deux_top_5 AS (
JOIN classement_individuel CI1 ON J.idjoueur = CI1.idjoueur SELECT DISTINCT
JOIN classement_individuel CI2 ON J.idjoueur = CI2.idjoueur J.nom,
JOIN classement C1 ON C1.idclassement = CI1.idclassement J.prenom
JOIN classement C2 ON C2.idclassement = CI2.idclassement FROM
WHERE CI1.rang >= 5 AND CI2.rang >= 5 joueur J
AND C1.portee = "nationale" AND C2.portee = "nationale" JOIN classement_individuel CI1 ON J.idjoueur = CI1.idjoueur
AND CI1.idclassement < CI2.idclassement); 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". -- "Pour chaque taille de plateau, donner le nombre de parties jouées avec un plateau de cette taille".
CREATE VIEW tailles_plateaux AS CREATE VIEW
(SELECT taille, COUNT(idpartie) AS nb_parties tailles_plateaux AS (
FROM plateau JOIN partie USING(idplateau) SELECT
GROUP BY taille); 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" -- "Le top 5 des joueurs (pseudo) qui ont joué le plus de parties"
CREATE VIEW top_joueurs_parties_jouees AS CREATE VIEW
(SELECT pseudo, COUNT(idPartie) AS nb_parties top_joueurs_parties_jouees AS (
FROM joueur JOIN joue USING(idjoueur) SELECT
GROUP BY idjoueur pseudo,
ORDER BY nb_parties DESC); COUNT(idPartie) AS nb_parties
FROM
joueur
JOIN joue USING (idjoueur)
GROUP BY
idjoueur
ORDER BY
nb_parties DESC
);
CREATE VIEW top_5_joueurs_parties_jouees AS CREATE VIEW
(SELECT * FROM top_joueurs_parties_jouees LIMIT 5); top_5_joueurs_parties_jouees AS (
SELECT
*
FROM
top_joueurs_parties_jouees
LIMIT
5
);
-------------------------------------------------------------------
-- Fonctionalités afficherParties
-- Afficher les parties dans l'état "a venir"
CREATE VIEW
parties_a_venir AS (
SELECT
*
FROM
partie
WHERE
etat = "a venir"
);
-- Afficher les parties dans l'état "en cours"
CREATE VIEW
parties_en_cours AS (
SELECT
*
FROM
partie
WHERE
etat = "en cours"
);
-- Afficher les parties dans l'état "terminee"
CREATE VIEW
parties_terminees AS (
SELECT
*
FROM
partie
WHERE
etat = "terminee"
);
-- Afficher les parties dans l'état "terminee"
-- les 50 parties les plus récentes (avec un tri de la plus récente à la plus ancienne)
CREATE VIEW
parties_terminees_recentes AS (
SELECT
*
FROM
partie
WHERE
etat = "terminee"
ORDER BY
date_partie ASC
LIMIT
50
);
-- Afficher les parties dans l'état "terminee"
-- Les 50 parties plus rapides par taille de plateau"
-- (avec un tri par nombre de cartes décroissant puis, pour les parties avec un plateau de même taille,
-- de la plus rapide à la plus lente)
CREATE VIEW
parties_terminees_rapides AS (
SELECT
*
FROM
partie pa
JOIN plateau pl USING (idplateau)
WHERE
etat = "terminee"
ORDER BY
pl.taille ASC,
duree ASC
LIMIT
50
);