Requête SQL
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Requête SQL



  1. #1
    Theophane

    Requête SQL


    ------

    Bonjour,

    Je sollicite votre aide pour trouver une requête SQL que je n'arrive pas à trouver !
    Voici la situation en très simplifié.

    J'ai une table avec une liste de matchs qui contient dans une colonne l'arbitre du match, et une table avec l'ensemble des arbitres.
    Pour simplifier, et en ne prenant que les colonnes utiles, prenons la situation suivante.

    Code:
    Table rencontre
    equipe | nom_arbitre
        A         A
        A         A
        C         B
        B         A
        A         C
        B         D
    
    Table arbitre
    nom_arbitre
    A
    B
    C
    D
    Ce que je veux, c'est le nombre de match arbitré par chaque arbitre pour chaque équipe, y compris si c'est 0 fois (et c'est cette dernière close le problème).

    Si je fais la commande (j'ai bien essayé une jointure externe, mais il est logique qu'elle ne fonctionne pas en fait...)
    Code:
    SELECT arbitre.nom_arbitre, equipe, COUNT(arbitre.nom_arbitre) AS nb_matchs_arbitre 
    FROM rencontre RIGHT JOIN arbitre ON rencontre.nom_arbitre = arbitre.nom_arbitre
    GROUP BY  arbitre.nom_arbitre, equipe ORDER BY arbitre.nom_arbitre ASC, nb_matchs_arbitre DESC, equipe ASC
    Il me manque tous les cas où un arbitre n'a jamais arbitré tel ou tel équipe.

    Cette commande donne comme résultat

    Code:
    nom_arbitre | equipe | nb_matchs_arbitre
        A             A                 2
        A             B                 1
        B             C                 1
        C             A                 1
        D             B                 1
    Or je voudrais
    Code:
    nom_arbitre | equipe | nb_matchs_arbitre
        A             A                 2
        A             B                 1
        A             C                 0
        A             D                 0
        B             C                 1
        B             A                 0
        B             B                 0
        B             D                 0
        C             A                 1
        C             B                 0
        C             C                 0
        C             D                 0
        D             B                 1
        D             A                 0
        D             C                 0
        D             D                 0
    Comment puis-je faire ?
    Merci d'avance.

    -----
    Dernière modification par JPL ; 10/08/2013 à 12h51.

  2. #2
    bisou10

    Re : Requête SQL

    Salut, en passant rapidement, la requête semble cohérente (tu as correctement utilisé une jointure LEFT ou RIGHT pour récupérer les enregistrements vides, par exemple). Par contre ce qu'il t'empeche d'avoir ce que tu souhaites, c'est le GROUP BY. Commence par le supprimer. Mais ca risque d'empecher le COUNT() de fonctionner, j'ai un doute là.

  3. #3
    Theophane

    Re : Requête SQL

    Salut,

    Merci pour ta réponse. Ceci étant, j'ai oublié de dire que j'avais eu une réponse sur developpez.net (my mistake).
    Il fallait passer par une sous-requête pour d'abord avoir toutes les associations possibles entre équipe et arbitre.
    Code:
    SELECT
        association.nom_arbitre,
        association.equipe,
        COUNT(rencontre.arbitre) AS nb_match_arbitre
    FROM
        (
                SELECT DISTINCT
                    rencontre.equipe
                FROM
                    rencontre
           JOIN arbitre
        ) AS association -- associe chaque équipe à chaque arbitre
        
        LEFT OUTER JOIN rencontre
                     ON association.nom_arbitre = rencontre.nom_arbitre AND association.equipe = recnontre.equipe
    GROUP BY
        association.nom_arbitre,
        association.equipe
    ORDER BY
        arbitre.nom_arbitre ASC,
        nb_matchs_arbitre DESC,
        equipe ASC

  4. #4
    bisou10

    Re : Requête SQL

    Le problème des NESTED QUERIES est la performance, mais oui ca marche.

    Perso, je préfère généralement conseiller:
    - tu crées une vue avec la requête 1
    - tu crées une réquete 2 sur cette vue

  5. A voir en vidéo sur Futura
  6. #5
    Theophane

    Re : Requête SQL

    Effectivement, c'est ce que j'avais répondu, la requête est un peu longue (0.7 seconde). Quand tu parles de vue, tu veux dire une vue matérialisée ? Parce que sinon, je vois pas trop ce que ça change, une vue n'étant rien d'autre qu'un raccourci pour une commande select, non ? Merci des conseils en tout cas.

  7. #6
    bisou10

    Re : Requête SQL

    Oui, les 2 lignes de mon commentaires précédent sont décorrélées

    La vue simplifie le cheminement intellectuel sur la création des requetes.

    Ca ne change ni le résultat, ni la performance en cas d'une base de donnée qui bouge rapidement. En réalité, même une nested query bénéficie de mécanismes de cache qui font que de toutes façons la résolution sera identique.

    Pour améliorer les perfs, il faut choisir des indexs pertinents (en particulier sur les colonnes que tu mets dans le JOIN), créer des clés étrangères, etc.. voire, avec MySQL par exemple, changer de moteur de base de données (MYISAM support les indexs FULLTEXT de mémoire, ce qui permet d'indexer du texte libre plus ou moins bien)

  8. #7
    Theophane

    Re : Requête SQL

    Salut bisou (ça me fait bizarre d'écrire ça xD)

    Tu peux aller voir ce lien : http://www.developpez.net/forums/d13...resquot-count/

    Je m'étais gaufré dans mes conditions de jointure (de façon très débile tu verras...) ce qui fait que les index n'était pas toujours utilisés.
    Merci de l'intérêt porté à mon problème.

    A+

Discussions similaires

  1. sql requete
    Par aminaa dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 13/02/2013, 18h28
  2. Requete SQL
    Par invitef84ed095 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 26/12/2010, 11h57
  3. [Divers] requete
    Par enebre dans le forum Dépannage
    Réponses: 0
    Dernier message: 25/01/2008, 20h58
  4. requête SQL
    Par inviteafd8fc22 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 07/01/2008, 16h02
  5. Requete SQL
    Par invite4a3050ae dans le forum Internet - Réseau - Sécurité générale
    Réponses: 6
    Dernier message: 14/05/2004, 12h57