1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut Blocage au niveau d'une requête

    Bonjour à tous,

    Je sollicite votre aide pour un petit blocage que je rencontre au niveau d'une requête SQL.

    Pour mettre en situation sur ce que je souhaite faire :

    Dans le but d'un suivi de tournoi, je récupère pour chaque ronde suisse les teams encore en lice (donc non disqualifiées) et je regarde dans la composition de chaque équipe les classes représentées. (druide, assassin etc...) A ce niveau là ça fonctionne et la requête est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT COUNT(`id`), `nom_classe` FROM `freeze_cup` AS cup 
    INNER JOIN `classes_tournoi` AS ct 
    ON cup.classes LIKE CONCAT('%', ct.nom_classe, '%') 
    WHERE `ronde` = '".$_GET['ronde']."' GROUP BY ct.nom_classe 
    ORDER BY COUNT(`id`) DESC
    J'obtiens donc bien mon comptage de représentation de chaque classe pour chaque ronde du tournoi.

    A cela je souhaite obtenir le %age de victoire de chaque classe pour chaque ronde, ma requête étant la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT COUNT(cup.id), ct.nom_classe FROM `freeze_cup` AS cup  
    INNER JOIN `cup_winrate` AS wr
          ON cup.team_name = wr.team_name
    INNER JOIN `classes_tournoi` AS ct 
          ON cup.classes LIKE CONCAT('%', ct.nom_classe, '%')
    WHERE cup.ronde = '".$_GET['ronde']."' AND wr.ronde = '".$_GET['ronde']."' GROUP BY ct.nom_classe ORDER BY COUNT(cup.id) DESC
    Elle fonctionne visiblement bien également.

    Le problème maintenant :

    Pour mon affichage, je souhaite afficher l'une à côté de l'autre les valeurs de représentations et de %age de victoire de chaque classe, et souhaitais donc ordonner les résultats de ma seconde requête en fonction des résultats de la première. Puisque actuellement, avec ces deux requêtes, elles ne sont pas dans le même ordre.

    Auriez vous une solution à m'apporter ? N'étant pas un grand adepte du SQL, j'ai l'habitude des requêtes "simples" mais j'arrive à un moment où ça ne passe plus Il se pourrait même que je n'ai pas besoin de deux requêtes et qu'une seule soit suffisante, mais j'avoue sécher un peu sur sa conception.

    J'ai pour l'instant trié mes résultats par classe et non par représentation en attendant de régler ce blocage ^^'.

    Si cela peut aider, voici comment se présentent les trois tables utilisées :

    table cup_winrate :
    Je récupère la liste des teams gagnantes de chaque ronde sous forme d'une simple liste :


    table classes_tournoi :
    Liste avec les classes autorisées dans le tournoi :


    table freeze_cup :
    Contient les informations de base sur les équipes :


    Merci d'avance de vos réponses qui, je l'espère, pourront m'aider !

  2. #2
    Expert éminent
    Homme Profil pro
    Développeur Freelance
    Inscrit en
    janvier 2009
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Freelance

    Informations forums :
    Inscription : janvier 2009
    Messages : 3 179
    Points : 6 723
    Points
    6 723

    Par défaut

    Bonjour,
    Pourquoi ne pas faire faire une seule requête, qui fait une jointure entre les deux requêtes présentées ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select coalesce(r1.code,r2.code),r1.score,r2.score
    from
    (
    select code,count(unerubrique) as score
    from...
    ) as r1
    full outer join
    (
    select code,count(autrerubrique) as score
    from...
    ) on r1.code = r2.code
    order by ...

    Le FULL OUTER JOIN est ici obligatoire, car il faut gérer le cas où une des deux requête ne renvoie aucune ligne pour un "code" donné.

    Tatayo.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    Bonsoir,

    Je vous remercie pour votre réponse, mais après quelques tests j'obtiens une erreur me disant que "Le mot clé OUTER n'est pas reconnu".

    Je ne l'avais pas précisé, mais je suis sous PHP 5.4 et MySQL 5.5.34.

  4. #4
    Expert éminent
    Homme Profil pro
    Développeur Freelance
    Inscrit en
    janvier 2009
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Freelance

    Informations forums :
    Inscription : janvier 2009
    Messages : 3 179
    Points : 6 723
    Points
    6 723

    Par défaut

    Visiblement MySQL ne supporte pas le FULL OUTER JOIN
    En cherchant sur le Web on trouve des solutions pour le remplacer par une UNION.
    C'est moche, mais ça semble fonctionner...

    En passant je corrige ma requête, dans laquelle il manque un alias:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select coalesce(r1.code,r2.code),r1.score,r2.score
    from
    (
    select code,count(unerubrique) as score
    from...
    ) as r1
    full outer join
    (
    select code,count(autrerubrique) as score
    from...
    ) as r2 on r1.code = r2.code
    order by ...

    Tatayo.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 254
    Points : 22 033
    Points
    22 033

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select  *
    from    a
        full outer join
            b
            on  a.id  = b.id
    ;
    Est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select  *
    from    a
        left outer join
            b
            on  a.id  = b.id
    union
    select  *
    from    a
        right outer join
            b
            on  a.id  = b.id
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

Discussions similaires

  1. aide au niveau d' une requète
    Par mdimagho dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2013, 08h03
  2. [1.x] Probléme au niveau d'une requête DQL
    Par simolewestside dans le forum Symfony
    Réponses: 1
    Dernier message: 27/12/2012, 12h31
  3. concaténation au niveau d'une requête
    Par beet2che dans le forum VB.NET
    Réponses: 5
    Dernier message: 25/08/2008, 10h11
  4. Réponses: 4
    Dernier message: 27/03/2008, 20h16
  5. Réponses: 5
    Dernier message: 04/09/2007, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo