Aller au contenu

Requete SQL compliquée avec jointure


Sujets conseillés

Posté

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

**EDIT** Modérateur (TheRec): Merci d'utiliser les BBCodes pour présenter du code, en l'occurrence la balise SQL ou CODE :)

Posté

Bonjour,

La requète suivante n'est pas suffisante ?

SELECT *
FROM classement WHERE id_team=11
ORDER BY date ASC

Posté

Non parce qu'en fait le but de cette requete est la suivante :

Combien d'équipes ont un nombre supérieur de points et une meilleure différence de buts que l'équipe que j'ai sélectionné.

Avec cela, je serais capable de terminer quelle est la position de l'équipe dans le classement.

En faisant un GROUP BY id_day, j'aurais la liste de toutes les journées du championnat, avec la place dans le classement pour l'équipe dans chaque journée

@+

Posté

Ok je vois (maintenant) ce que tu veux dire... effectivement c'est plus complexe que ce que j'ai proposé :P

Tu veux que l'équipe sélectionnée apparaisse en tête de liste ?

Posté

Hello,

Ca y est, j'ai trouvé la solution

Les conditions de la jointure n'étant pas assez restrictive, car c'est une expression logique qui ne classe pas les critères par ordre d'importance, il est nécessaire de les "découper".

Cela nous donne :

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 OR (C1.pts = C2.pts AND C1.bp-C1.bc < C2.bp-C2.bc) OR (C1.pts = C2.pts AND C1.bp-C1.bc = C2.bp-C2.bc AND C1.bp <= C2.bp)
WHERE C1.id_team = 11 AND C1.id_day = C2.id_day
GROUP BY C1.id_day

Merci à tous

@+

cadou

**EDIT** Modérateur (TheRec): Merci d'utiliser les BBCodes pour présenter du code, en l'occurrence la balise SQL ou CODE :)

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...