Probleme sur requete SQL compliquée avec jointure

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Probleme sur requete SQL compliquée avec jointure

par cadoudal56 » 30 nov. 2006, 16:30

C'est bizarre parce que la requete que je donne en exemple fonctionne bien, mais elle ne renvoi pas le résultat exact...
Ce que je souhaiterais c'est affiner la jointure mais je ne vois pas comment faire....

Si quelqu'un a une idée

@+
cadou

par Hubert Roksor » 30 nov. 2006, 15:22

Disons que c'est faisable en SQL, mais la requête ferait à peu près la taille de l'écran :lol:

Le mieux serait de le faire en PHP. Tu crées un tableau multidimensionnel $arr qui contient tous les résultats. Tu récupères le classement total en le classant par journée et par rang : (à toi de corriger la requête selon tes besoins)
$sql = '  SELECT id_day, id_team, (bp - bc) AS goal_average
		    FROM classements
		   WHERE id_day BETWEEN 1 AND 5
		ORDER BY id_day ASC, pts DESC, goal_average DESC';

$result = mysql_query($sql, $db);
Puis pour chaque enregistrement $row tu mets le classement de chaque équipe dans le grand tableau. $rank commence à zéro et est incrémenté à chaque usage. On le remet à zéro à chaque nouvelle journée
$day = NULL;

$arr = array();
while ($row = mysql_fetch_assoc($result))
{
	if ($row['id_day'] !== $day)
	{
		$rank = 0;
		$day = $row['id_day'];                   
	}

	$arr[$row['id_team']][$row['id_day']] = ++$rank;
}
Au final tu devrais avoir le classement équipe par équipe, jour par jour dans ton tableau $arr.

Probleme sur requete SQL compliquée avec jointure

par cadoudal56 » 30 nov. 2006, 14:14

Bonjour à tous et à toutes,

Je me permet de poster mon probleme car cela fais 3 jours que je tourne en rond et je ne trouve pas la sortie... J'ai bien sur tenter de trouver une réponse sur le web, mais cela doit etre bien caché car je ne trouve pas...

Cela va sembler banal pour certaines pointures du SQL, mais pour moi, ce n'est pas aussi simple qu'il n'y parait.

Voici mon probleme...

Je tente de créer un site sur des championnats sportifs
J'ai une table que l'on va appeller classement, et qui contient des infos comme la journée, les points, l'ID de l'équipe etc....

Pour sortir un classement je fais un SELECT tout bete avec les ORDER BY qui vont bien et qui me sors le classement des équipes de la 1ere à la dernière. Le classement se fait par points, puis à la différence de but et enfin par nombre de buts marqués.

Je donne ici le nom des champs pour que l'on s'y retrouve mieux

id_team => ID de l'équipe
id_day => ID de la journée jouée
pts => Points de l'équipe
bp => Buts Placés (buts marqués)
bc => Buts Concédés (buts pris)

Voic mon probleme :
J'aimerais sortir une requete qui me donne pour une équipe X son classement journée après journées (ie : Journée 1 => 3eme, journée 2 => 6eme, Journée 3 => 6ème, Journée 4 => 10ème etc...)

J'ai trouvé un bout de requète que j'ai réadapté et qui ma foi fonctionne, mais qui n'est pas réaliste, c'est à dire que cela me remonte des trucs, mais c'est faux... C'est qu'il doit y avoir une erreur quelque part :

Voici ce que j'ai :

SELECT C1.id_team, count(C2.id_team) AS rang, C1.pts
FROM classement AS C1
JOIN classement AS C2 ON C1.pts <= C2.pts
WHERE C1.id_team = 11
AND C1.id_day = C2.id_day
GROUP BY C1.id_day

Ce que je n'arrive pas à faire, c'est avoir la bonne place de l'équipe dans le classement. Je me suis dis que c'est surement parce que dans le SELECT j'ai mes conditions dans le ORDER BY qui réorganise bien le tout, et que je ne les ai pas ici... Alors j'ai éssaye :

SELECT C1.id_team, count(C2.id_team) AS rang, C1.pts
FROM classement AS C1
JOIN classement AS C2 ON C1.pts <= C2.pts AND (C1.bp - C1.bc) < (C2.bp - C2.bc)
WHERE C1.id_team = 11
AND C1.id_day = C2.id_day
GROUP BY C1.id_day

Mais cela me remonte des trucs encore plus fantaisiste.
Bref je tourne en rond et je n'y arrive pas...
Si une bonne ame charitable, experte en SQL pouvait m'aider....

Merci d'avance