8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je me permets de solliciter votre aide pour réaliser en SQL/PHP les scores des équipes puis de les classer.
Victoire : 3 points;
Egalité: 2 points,
Défaite: 1 point puis en cas d'égalité nombre de buts gagnés-nombre de buts encaissés.

J'ai essayé mais je ne parviens pas à réaliser la requete. Voici la structure de ma table,
- equipe(id_equipe, nom_equipe, type)
-tournoi(id_tournoi, nom_tournoi)
-matchs(id_match, resultat_match, date_match, lieu_match, #equipe_dom, #equipe_ext, #id_tournoi)

un exemple d'insertion:

INSERT INTO matchs` (`id_match` ,`resultat_match` ,`date_match` ,`lieu_match` ,`equipe_dom` ,`equipe_ext` ,`id_tournoi` )
VALUES (NULL , '5-7', '2009-03-10', 'paris', '10', '4', '1');

Le champ résultat_match est en varchar donc je convertis comme ceci:

CAST(left(resultat_match, 1) as UNSIGNED)
CAST(right(resultat_match, 1) as UNSIGNED)


Je sais qu'il y a un problème lorsque le score passe à 2 chiffres mais je cherche à le résoudre actuellement.


$requete="SELECT*,
CAST(left(resultat_match, 1) as UNSIGNED) as score_dom, 
CAST(right(resultat_match, 1) as UNSIGNED) as score_ext from matchs group by id_tournoi, equipe_dom, equipe_ext";

$query=mysql_query($requete) or die(mysql_error() . $requete);
while($row=mysql_fetch_array($query))
{
$a = 0 ;

$score_dom=$row['score_dom'];
$score_ext=$row['score_ext'];
$equipe_dom=$row['equipe_dom'];
$equipe_ext=$row['equipe_ext'];

if($score_dom > $score_ext) 
{
$a +=3;
$a1 ++;

$b=$a;
echo $b.' // '.stripslashes($row['equipe_dom']).' // '.stripslashes($row['score_dom']).' </br>' ;

$b1=$a1;
echo $b1.' // '.stripslashes($row['equipe_ext']).' // '.stripslashes($row['score_ext']).' </br>' ;
}
elseif($score_dom < $score_ext)
{
$a +=3;
$a1 ++;

$c=$a;
echo $c.' // '.stripslashes($row['equipe_ext']).' // '.stripslashes($row['score_ext']).' </br>' ;

$c1=$a1;
echo $c1.' // '.stripslashes($row['equipe_dom']).' // '.stripslashes($row['score_dom']).' </br>' ;
}
elseif($score_dom == $score_ext)
{
$a +=2;
$d=$a;

echo $d.' // '.stripslashes($row['equipe_ext']).' // '.stripslashes($row['score_ext']).' </br>' ;
echo $d.' // '.stripslashes($row['equipe_dom']).' // '.stripslashes($row['score_dom']).' </br>' ;
}
}

Je n'ai pas réussi à obtenir le résultat attendu...

Merci d'avance
Modifié par Cecilia (21 Mar 2009 - 23:51)
Salut,

je pense que tu te simplifierais la vie en créant une nouvelle table resultats :

* id_resultat
* id_match
* dom_ext (0 = domicile / 1 = extérieur)
* id_equipe
* nb_points (3 = victoire / 2 = nul / 1 =défaite)
* nb_buts_marques
* nb_buts_encaisses

la table matchs devient :

* id_match
* id_tournoi
* date_match
* lieu_match

l'insertion est un peu plus "longue" mais puisqu'elle n'est exécutée qu'une fois ce n'est pas gênant :
INSERT INTO matchs set id_tournoi = 1, date_match =  '2009-03-10', lieu_match = 'paris'
$id_match = mysql_insert_id();
INSERT INTO resultats set id_match = $id_match, dom_ext = 0, id_equipe = 10, nb_points = 1, nb_buts_marques = 5, nb_buts_encaisses = 7
INSERT INTO resultats set id_match = $id_match, dom_ext = 1, id_equipe = 4, nb_points = 3, nb_buts_marques = 7, nb_buts_encaisses = 5
Pour la restitution cela devient tout de suite plus facile Smiley cligne :
SELECT id_equipe, sum(nb_points) as total_points, 
sum(nb_buts_marques) as total_buts_marques, 
sum(nb_buts_encaisses) as total_buts_encaisses, 
sum(nb_buts_marques) - sum(nb_buts_encaisses) as quota_buts 
FROM resultats group by id_equipe 
order by total_points desc, quota_buts desc
Bonsoir,

Merci beaucoup de m'avoir répondu. En effet, votre méthode est beaucoup plus simple que la mienne. Je vais donc essayer de la réaliser.
Pour le champ nb_points (3 = victoire / 2 = nul / 1 =défaite), je pense que je vais mettre une condition pour que au moment de l'insertion, les points s'enregistrent automatiquement, sans que l'admin saississe les points.

Bonne soirée
Cecilia a écrit :
Pour le champ nb_points (3 = victoire / 2 = nul / 1 =défaite), je pense que je vais mettre une condition pour que au moment de l'insertion, les points s'enregistrent automatiquement, sans que l'admin saississe les points.
Oui : c'était l'idée. Smiley smile
Bonjour,

Je reviens vous sollciter de l'aide car pour update le champ résultat, j'ai un problème pour modifier les deux champs en meme temps:

$req1="UPDATE resultat SET nb_points='" . $nb_points . "', nb_buts_marques='" . $score_dom . "', nb_buts_encaisses='" . $score_ext . "', id_equipe='" . $equipe_dom . "' WHERE id_match=$id_match";
$result1=mysql_query($req1)or die(mysql_error() . $req1);

$req2="UPDATE resultat SET nb_points='" . $nb_points1 . "', nb_buts_marques='" . $score_ext . "', nb_buts_encaisses='" . $score_dom . "', id_equipe='" . $equipe_ext . "' WHERE id_match=$id_match";
$result2=mysql_query($req2)or die(mysql_error() . $req2);


Lorsque je modifie les données, les deux champs s'enregistrent les memes données, car en effet, je fixe
 id_match=$id_match 


J'ai donc essayé pour les deux update:
...where id_match=$id_match and id_equipe=$equipe_dom
...where id_match=$id_match and id_equipe=$equipe_ext

Mais si l'utilsiateur modifie les noms des equipes, les noms des equipes ne sont pas modifiées. Je n'ai pas réussi à récup leur deux clés primaires..


Merci d'avance
Salut,

je ne comprends pas bien le problème mais voici les 3 clefs uniques d'accès à la table résultats :
* id_resultat
* id_match + id_equipe
* id_match + dom_ext

Donc il y a sûrement moyen de s'en sortir même si bien sûr on ne peut pas modifier en même temps id_equipe et dom_ext (ce qui n'aurait pas beaucoup de sens mais au pire il suffirait de faire 2 UPDATE ou un DELETE et un INSERT). Smiley smile

En reprenant ton exemple ça devrait fonctionner avec :
...where id_match=$id_match and dom_ext=0
...where id_match=$id_match and dom_ext=1
Bonjour,

En fait, je n'ai pas supprimé les champs "equipe_dom et equipe_ext" dans la table matchs car cela me facilite au niveau de l'affichage et aussi j'avais deja fait une requete SQL pour :

Equipe_dom | Score | Equipe_ext

Donc comme la table matchs gere deja les equipe_dom et equipe_ext, j'ai donc supprimé dans la table résultat. Mais je vais le remettre le champ dom_ext dans la table resultat.

Merci de m'avoir consacré du temps.
Modifié par Cecilia (22 Mar 2009 - 16:29)
Cecilia a écrit :
En fait, je n'ai pas supprimé les champs "equipe_dom et equipe_ext" dans la table matchs car cela me facilite au niveau de l'affichage et aussi j'avais deja fait une requete SQL pour :

Equipe_dom | Score | Equipe_ext
Ah OK ! Je les avais justement enlevés pour respecter l'unicité des données (première forme normale).
Modifié par Heyoan (22 Mar 2009 - 16:41)
Oui, pas de problème, je garde pour l'instant ces champs, quand j'aurai fini de faire les fonctions supp/modif..je referai les codes pour l'affichage des donnés. Smiley smile
Bonjour,
Je suis désolée de vous déranger encore. Voilà, ce projet de site sportif pour le compte d'une association que je réalise rentre dans le cadre de ma formation, et mon responsable de formation préfèrerait que je fasse pas l'insertion des points directement dans la base de données, car si l'administrateur modifies directement des scores dans la base, les points seront faussés. Je dois donc retourner à ma requête complexe pour calculer les points. La structure de mes tables est encore changée! Association réflexive :
equipe(id_equipe, nom_equipe, type_equipe)
jouer (id_eq_dom, id_eq_ext, score_dom, score_ext)

J'ai donc refait la requete mais j'ai un message d'erreur "Le champ 'id_eq_dom' ne peut être vide (null)"

// somme des équipes
$req="SELECT count(*) as nb_equipe from equipe";
$result=mysql_query($req) or die(mysql_error() . $req);
$row=mysql_fetch_array($result);
$nb_equipe=$row['nb_equipe'];

// calcul des points de 1 à $i equipe
for($i = 1; $i <= $nb_equipe; $i++)
{
$requete = " SELECT id_eq_dom, id_eq_ext, SUM(point) as total
FROM
(SELECT*, count(*)*3 as point from jouer
where
(id_eq_ext=$i
AND score_ext > score_dom)
OR
(id_eq_dom=$i
AND score_dom > score_ext )

UNION ALL

SELECT*, count(*)*1 as point from jouer
where
(id_eq_ext=$i
AND score_ext < score_dom)
OR
(id_eq_dom=$i
AND score_dom < score_ext)

UNION ALL
SELECT*, count(*)*2 as point from jouer
where
(id_eq_ext=$i
OR
id_eq_dom=$i
AND
score_dom = score_ext)) as abcd
GROUP BY id_eq_dom, id_eq_ext ";

// Affichage de la requete
$query=mysql_query($requete) or die(mysql_error() . $requete);
$row=mysql_fetch_array($query);
{
echo $row['total'];
}
}


Merci d'avance Smiley smile
Modifié par Cecilia (24 Mar 2009 - 18:09)
Bonjour,

Mon problème est résolu,
Il me reste à faire un tableau à deux dimensions., voici la requete, pour ceux qui en auraient besoin:
SELECT id_equipe, SUM(points) AS total_points
FROM equipe
	JOIN (
		SELECT id_eq_dom AS equipe, CASE 
					WHEN score_dom>score_ext THEN 3
					WHEN score_dom=score_ext THEN 2
					WHEN score_dom<score_ext THEN 1 END AS points FROM jouer
		UNION ALL
		SELECT id_eq_ext AS equipe, CASE 
					WHEN score_ext>score_dom THEN 3
					WHEN score_ext=score_dom THEN 2
					WHEN score_ext<score_dom THEN 1 END AS points FROM jouer
	) td
		ON equipe.id_equipe=td.equipe
GROUP BY id_equipe;


Bonne journée