IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Blocage au niveau d'une requête


Sujet :

Langage SQL

  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 : 29
    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 sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 284
    Points : 12 986
    Points
    12 986
    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 : 29
    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 sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 284
    Points : 12 986
    Points
    12 986
    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
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 480
    Points
    28 480
    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
    ;

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, 09h03
  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, 13h31
  3. concaténation au niveau d'une requête
    Par beet2che dans le forum VB.NET
    Réponses: 5
    Dernier message: 25/08/2008, 11h11
  4. Réponses: 4
    Dernier message: 27/03/2008, 21h16
  5. [Oracle] Problème au niveau d'une requête et de l'utilisation de son résultat
    Par LethaL86 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/09/2007, 15h31

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