Le schéma de ta base est donc qqch comme ça :
JOUEUR --- CLASSEMENT --- ANNEE SCOL --- EVENEMENT
| |
------------------------------------- RESULTAT
Or, je suppose que si un joueur n'a participé à aucun match, il n'a pas
de classement ELO ? du coup, cela t'empêche de passer de Jouer à Année
scolaire.
Il faut donc que tu commences par générer tous les couples (Joueur,
Année scolaire) possibles avec un produit cartésien ; à partir de là, tu
fais des LEFT JOIN sur Evénement et Résultat.
ça devrait donc ressembler à qqch comme ça :
Select jo_nom, jo_prénom, as_nom, count(*) as nb_matchs
From joueur J
CROSS JOIN année_scolaire A
LEFT JOIN évènement E ON A.as_id = E.év_ID
LEFT JOIN résultat R ON J.jo_id = R.jo_id AND E.év_id = R.év_id
GROUP BY jo_nom, jo_prénom, as_nom,
order by jo_nom,jo_prénom,as_nom
qq petites remarques :
- dans ton CREATE TABLE événement, tu crées un té_ID au lieu d'un ré_id
- c'est bien de donner tes CREATE TABLE... avec qq lignes de données
sous forme de INSERT, c'est encore mieux !
- attention, dans ta première requête tu écris classement_elo.jo_ID au
lieu de classement_ELO.jo_ID ; ça passe sans pb en local sur ton
Windows, mais quand tu mettras ça sur le serveur Linux de Free tu auras
des surprises... au passage, tu noteras que je simplifie l'écriture des
jointures en donnant des alias aux tables (J pour joueur, A pour
année_scolaire, etc.)
- selon l'ampleur temporelle de tes données, générer tous les couples
(Joueur, Année scolaire) peut t'amener à présenter des données idiotes,
comme "Machin, 1960-61 : 0 matchs", "Machin, 1961-62 : 0 matchs", etc.
pour un gars né en 1980. Dans ce cas, tu peux par exemple vouloir te
limiter aux années comprises entre la première et la dernière
participation. En supposant que le tri de tes as_id soit
chronologiquement valable, tu peux générer une table temporaire de ce
genre là :
CREATE TEMPORARY TABLE joueur_periode
SELECT jo_id, min(as_id) AS as_id_deb, max(as_id) AS as_id_fin
FROM joueur J
INNER JOIN classement_ELO C ON J.jo_id = C.jo_id
;
ensuite, dans la requête principale, tu remplaces le
joueur J
CROSS JOIN année_scolaire A
par qqch comme
joueur J
INNER JOIN joueur_periode JP ON J.jo_id = JP.jo_id
INNER JOIN année_scolaire A
ON A.as_id BETWEEN JP.as_id_deb AND JP.as_id_fin
Le schéma de ta base est donc qqch comme ça :
JOUEUR --- CLASSEMENT --- ANNEE SCOL --- EVENEMENT
| |
------------------------------------- RESULTAT
Or, je suppose que si un joueur n'a participé à aucun match, il n'a pas
de classement ELO ? du coup, cela t'empêche de passer de Jouer à Année
scolaire.
Il faut donc que tu commences par générer tous les couples (Joueur,
Année scolaire) possibles avec un produit cartésien ; à partir de là, tu
fais des LEFT JOIN sur Evénement et Résultat.
ça devrait donc ressembler à qqch comme ça :
Select jo_nom, jo_prénom, as_nom, count(*) as nb_matchs
From joueur J
CROSS JOIN année_scolaire A
LEFT JOIN évènement E ON A.as_id = E.év_ID
LEFT JOIN résultat R ON J.jo_id = R.jo_id AND E.év_id = R.év_id
GROUP BY jo_nom, jo_prénom, as_nom,
order by jo_nom,jo_prénom,as_nom
qq petites remarques :
- dans ton CREATE TABLE événement, tu crées un té_ID au lieu d'un ré_id
- c'est bien de donner tes CREATE TABLE... avec qq lignes de données
sous forme de INSERT, c'est encore mieux !
- attention, dans ta première requête tu écris classement_elo.jo_ID au
lieu de classement_ELO.jo_ID ; ça passe sans pb en local sur ton
Windows, mais quand tu mettras ça sur le serveur Linux de Free tu auras
des surprises... au passage, tu noteras que je simplifie l'écriture des
jointures en donnant des alias aux tables (J pour joueur, A pour
année_scolaire, etc.)
- selon l'ampleur temporelle de tes données, générer tous les couples
(Joueur, Année scolaire) peut t'amener à présenter des données idiotes,
comme "Machin, 1960-61 : 0 matchs", "Machin, 1961-62 : 0 matchs", etc.
pour un gars né en 1980. Dans ce cas, tu peux par exemple vouloir te
limiter aux années comprises entre la première et la dernière
participation. En supposant que le tri de tes as_id soit
chronologiquement valable, tu peux générer une table temporaire de ce
genre là :
CREATE TEMPORARY TABLE joueur_periode
SELECT jo_id, min(as_id) AS as_id_deb, max(as_id) AS as_id_fin
FROM joueur J
INNER JOIN classement_ELO C ON J.jo_id = C.jo_id
;
ensuite, dans la requête principale, tu remplaces le
joueur J
CROSS JOIN année_scolaire A
par qqch comme
joueur J
INNER JOIN joueur_periode JP ON J.jo_id = JP.jo_id
INNER JOIN année_scolaire A
ON A.as_id BETWEEN JP.as_id_deb AND JP.as_id_fin
Le schéma de ta base est donc qqch comme ça :
JOUEUR --- CLASSEMENT --- ANNEE SCOL --- EVENEMENT
| |
------------------------------------- RESULTAT
Or, je suppose que si un joueur n'a participé à aucun match, il n'a pas
de classement ELO ? du coup, cela t'empêche de passer de Jouer à Année
scolaire.
Il faut donc que tu commences par générer tous les couples (Joueur,
Année scolaire) possibles avec un produit cartésien ; à partir de là, tu
fais des LEFT JOIN sur Evénement et Résultat.
ça devrait donc ressembler à qqch comme ça :
Select jo_nom, jo_prénom, as_nom, count(*) as nb_matchs
From joueur J
CROSS JOIN année_scolaire A
LEFT JOIN évènement E ON A.as_id = E.év_ID
LEFT JOIN résultat R ON J.jo_id = R.jo_id AND E.év_id = R.év_id
GROUP BY jo_nom, jo_prénom, as_nom,
order by jo_nom,jo_prénom,as_nom
qq petites remarques :
- dans ton CREATE TABLE événement, tu crées un té_ID au lieu d'un ré_id
- c'est bien de donner tes CREATE TABLE... avec qq lignes de données
sous forme de INSERT, c'est encore mieux !
- attention, dans ta première requête tu écris classement_elo.jo_ID au
lieu de classement_ELO.jo_ID ; ça passe sans pb en local sur ton
Windows, mais quand tu mettras ça sur le serveur Linux de Free tu auras
des surprises... au passage, tu noteras que je simplifie l'écriture des
jointures en donnant des alias aux tables (J pour joueur, A pour
année_scolaire, etc.)
- selon l'ampleur temporelle de tes données, générer tous les couples
(Joueur, Année scolaire) peut t'amener à présenter des données idiotes,
comme "Machin, 1960-61 : 0 matchs", "Machin, 1961-62 : 0 matchs", etc.
pour un gars né en 1980. Dans ce cas, tu peux par exemple vouloir te
limiter aux années comprises entre la première et la dernière
participation. En supposant que le tri de tes as_id soit
chronologiquement valable, tu peux générer une table temporaire de ce
genre là :
CREATE TEMPORARY TABLE joueur_periode
SELECT jo_id, min(as_id) AS as_id_deb, max(as_id) AS as_id_fin
FROM joueur J
INNER JOIN classement_ELO C ON J.jo_id = C.jo_id
;
ensuite, dans la requête principale, tu remplaces le
joueur J
CROSS JOIN année_scolaire A
par qqch comme
joueur J
INNER JOIN joueur_periode JP ON J.jo_id = JP.jo_id
INNER JOIN année_scolaire A
ON A.as_id BETWEEN JP.as_id_deb AND JP.as_id_fin
Or, je suppose que si un joueur n'a participé à aucun match, il n'a pas
de classement ELO ? du coup, cela t'empêche de passer de Jouer à Année
scolaire.
Non, tous les joueurs on un classement ELO, on leur attribue même la
première fois qu'il joue une classement 'fictif' qui dépend de l'age.
Il faut donc que tu commences par générer tous les couples (Joueur,
Année scolaire) possibles avec un produit cartésien ; à partir de là, tu
fais des LEFT JOIN sur Evénement et Résultat.
En adaptant ta requête pour mySQL qui ne connaît pas CROSS JOIN j'arrive à :
SELECT jo_nom, jo_prénom, as_nom, count( * ) AS nb_matchs
FROM joueur AS J, année_scolaire AS A
LEFT JOIN évènement AS E ON A.as_id = E.év_ID
LEFT JOIN résultat AS R ON J.jo_id = R.jo_id
AND E.év_id = R.év_id
GROUP BY jo_nom, jo_prénom, as_nom
ORDER BY jo_nom, jo_prénom, as_nom
Or, je suppose que si un joueur n'a participé à aucun match, il n'a pas
de classement ELO ? du coup, cela t'empêche de passer de Jouer à Année
scolaire.
Non, tous les joueurs on un classement ELO, on leur attribue même la
première fois qu'il joue une classement 'fictif' qui dépend de l'age.
Il faut donc que tu commences par générer tous les couples (Joueur,
Année scolaire) possibles avec un produit cartésien ; à partir de là, tu
fais des LEFT JOIN sur Evénement et Résultat.
En adaptant ta requête pour mySQL qui ne connaît pas CROSS JOIN j'arrive à :
SELECT jo_nom, jo_prénom, as_nom, count( * ) AS nb_matchs
FROM joueur AS J, année_scolaire AS A
LEFT JOIN évènement AS E ON A.as_id = E.év_ID
LEFT JOIN résultat AS R ON J.jo_id = R.jo_id
AND E.év_id = R.év_id
GROUP BY jo_nom, jo_prénom, as_nom
ORDER BY jo_nom, jo_prénom, as_nom
Or, je suppose que si un joueur n'a participé à aucun match, il n'a pas
de classement ELO ? du coup, cela t'empêche de passer de Jouer à Année
scolaire.
Non, tous les joueurs on un classement ELO, on leur attribue même la
première fois qu'il joue une classement 'fictif' qui dépend de l'age.
Il faut donc que tu commences par générer tous les couples (Joueur,
Année scolaire) possibles avec un produit cartésien ; à partir de là, tu
fais des LEFT JOIN sur Evénement et Résultat.
En adaptant ta requête pour mySQL qui ne connaît pas CROSS JOIN j'arrive à :
SELECT jo_nom, jo_prénom, as_nom, count( * ) AS nb_matchs
FROM joueur AS J, année_scolaire AS A
LEFT JOIN évènement AS E ON A.as_id = E.év_ID
LEFT JOIN résultat AS R ON J.jo_id = R.jo_id
AND E.év_id = R.év_id
GROUP BY jo_nom, jo_prénom, as_nom
ORDER BY jo_nom, jo_prénom, as_nom
Non, tous les joueurs on un classement ELO, on leur attribue même la
première fois qu'il joue une classement 'fictif' qui dépend de l'age.
OK. Donc c'est bcp plus simple que ce que je te disais.
MySQL, y compris dans la version 4.0 que propose Free, connaît CROSS
JOIN ! Ceci dit, tu peux effectivement le remplacer par une virgule,
techniquement c'est exactement la même chose.
ce qui donne, en passant par Classement_ELO :
SELECT jo_nom, jo_prénom, as_nom, count( ré_id ) AS nb_matchs
FROM joueur AS J
INNER JOIN classement_ELO AS C ON J.jo_id = C.jo_id
INNER JOIN année_scolaire AS A ON C.as_id = A.as_id
INNER JOIN évènement AS E ON A.as_id = E.as_ID
LEFT JOIN résultat AS R ON J.jo_id = R.jo_id AND E.év_id = R.év_id
GROUP BY jo_nom, jo_prénom, as_nom
ORDER BY jo_nom, jo_prénom, as_nom
Non, tous les joueurs on un classement ELO, on leur attribue même la
première fois qu'il joue une classement 'fictif' qui dépend de l'age.
OK. Donc c'est bcp plus simple que ce que je te disais.
MySQL, y compris dans la version 4.0 que propose Free, connaît CROSS
JOIN ! Ceci dit, tu peux effectivement le remplacer par une virgule,
techniquement c'est exactement la même chose.
ce qui donne, en passant par Classement_ELO :
SELECT jo_nom, jo_prénom, as_nom, count( ré_id ) AS nb_matchs
FROM joueur AS J
INNER JOIN classement_ELO AS C ON J.jo_id = C.jo_id
INNER JOIN année_scolaire AS A ON C.as_id = A.as_id
INNER JOIN évènement AS E ON A.as_id = E.as_ID
LEFT JOIN résultat AS R ON J.jo_id = R.jo_id AND E.év_id = R.év_id
GROUP BY jo_nom, jo_prénom, as_nom
ORDER BY jo_nom, jo_prénom, as_nom
Non, tous les joueurs on un classement ELO, on leur attribue même la
première fois qu'il joue une classement 'fictif' qui dépend de l'age.
OK. Donc c'est bcp plus simple que ce que je te disais.
MySQL, y compris dans la version 4.0 que propose Free, connaît CROSS
JOIN ! Ceci dit, tu peux effectivement le remplacer par une virgule,
techniquement c'est exactement la même chose.
ce qui donne, en passant par Classement_ELO :
SELECT jo_nom, jo_prénom, as_nom, count( ré_id ) AS nb_matchs
FROM joueur AS J
INNER JOIN classement_ELO AS C ON J.jo_id = C.jo_id
INNER JOIN année_scolaire AS A ON C.as_id = A.as_id
INNER JOIN évènement AS E ON A.as_id = E.as_ID
LEFT JOIN résultat AS R ON J.jo_id = R.jo_id AND E.év_id = R.év_id
GROUP BY jo_nom, jo_prénom, as_nom
ORDER BY jo_nom, jo_prénom, as_nom