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 :

Requête de sélection du dernier Match


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 90
    Points : 39
    Points
    39
    Par défaut Requête de sélection du dernier Match
    Bonjour,

    J'ai un petit problème de résultats pour uen requete :

    Le but de la requete est de rechercher quel est le dernier match joué pour une équipe de volley, l'adversaire, la date et le score pour l'afficher sur une page web.

    Mon problème : j'arrive à faire une sélection de 3 éléments, qui sont des matchs déjà joués et dont la date est passée. Je voudrais sortir de ces 3 éléments, le dernier joué en fonction de la date.

    Or, la date est correcte, mais l'adversaire ne correspond pas au dernier match joué mais au premiers.

    Voici les requetes et résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT code_adv, domicile, score, nom, matchs.code_equipe, adversaires.id_adv, max( date )
    FROM `matchs` , adversaires
    WHERE matchs.code_adv = adversaires.id_adv
    AND matchs.code_equipe = 'R1M'
    AND date <= current_date( )
    GROUP BY code_equipe, date
    ORDER BY date
    Résultats :
    (code adversaire, domicile, score, nom adversaire, equipe, code_adv, date)
    • 55 1 3/2 Sucé R1M 55 2006-01-15
      53 0 1/3 ASPTT Laval R1M 53 2006-01-21
      47 1 1/3 Cholet R1M 47 2006-01-29


    Si j'utilise un max(date) pour sortir celui du 2006-01-29, avec la requete suivante, j'arrive à une incohérence des résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT code_adv, domicile, score, nom, max( date ) , matchs.code_equipe, adversaires.id_adv
    FROM `matchs` , adversaires
    WHERE matchs.code_adv = adversaires.id_adv
    AND matchs.code_equipe = 'R1M'
    AND date <= current_date( )
    GROUP BY code_equipe
    ORDER BY date
    Résultats :
    • 55 1 3/2 Sucé 2006-01-29 R1M 55


    Ici, la date max est bien la bonne(2006-01-29), mais le code adversaire (code_adv) n'est plus le bon (55 au lieu de 47)

    Avez-vous une idée de la raison ?

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    En me bricolant sous Oracle un petit jeu d'essai avec une seule table Match, pas aussi complet que ton schéma donc, j'arrive à obtenir ce que tu veux via une sous-requête et un MAX :

    Voici le jeu d'essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE Match (
    CodeAdv Number(8),
    Domicile Number(1),
    Score VARCHAr2(10),
    DateMatch Date);
     
    INSERT INTO Match (CodeAdv, Domicile, Score, DateMatch)
                VALUES (55, 1, '3/2', TO_DATE('15/01/2006', 'dd/mm/yyyy'));
    INSERT INTO Match (CodeAdv, Domicile, Score, DateMatch)
                VALUES (53, 0, '1/3', TO_DATE('21/01/2006', 'dd/mm/yyyy'));
    INSERT INTO Match (CodeAdv, Domicile, Score, DateMatch)
                VALUES (47, 1, '1/3', TO_DATE('29/01/2006', 'dd/mm/yyyy'));
    COMMIT;
    Tu remplaceras TO_DATE, spécifique à Oracle, par un CAST ou toute autre fonction de conversion de chaîne en date
    Et ne pas utiliser le mot-clé Date comme nom de champ, c'est très imprudent ...



    Et la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CodeAdv, Domicile, Score, DateMatch
      FROM Match
     WHERE DateMatch = (SELECT MAX(DateMatch)
                          FROM Match);
    Si une clause WHERE doit être appliquée à la requête, il faut bien entendu l'appliquer sur la sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CodeAdv, Domicile, Score, DateMatch
      FROM Match
     WHERE DateMatch = (SELECT MAX(DateMatch)
                          FROM Match);
                         WHERE code_equipe = 'R1M')
       AND code_equipe = 'R1M'
    Si tu n'arrives pas à l'adapter, du dis

    PS : Attention, MySQL n'accepte les sous-requêtes qu'à partir de la version 4.1 !
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    ok merci c'est bon j'ai bien réussi à adapter.

    Cependant, je ne comprends pas pourquoi il faut que je fasse une sous-requete et que je n'y sois pas arriver avec une seule !!

    Merci du coup de mains.

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    MAX est une fonction d'agrégation, si tu l'utilise sur un champ de ton SELECT, cela va te calculer la valeur, indépendamment des autres champs.

    Cf un bon exemple ici : http://sql.developpez.com/sqlaz/select/#L4.6
    La requête donnée en exemple te ramène un MAX, un MIN, une moyenne, etc. sur une ligne, sans qu'il y ait forcément de "rapports" entre ces diffrentes valeurs.

    Dans mon cas, avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CodeAdv, Domicile, Score, MAX(DateMatch)
      FROM Match;
    J'obtiendrais autant de lignes que d'enregistrement de la table Match, mais le champs MAX(DateMatch) te renverra la même date sur toutes les lignes, car il est calculé sur un ensemble de lignes et n'est pas liées aux autre champs ramenés dans le SELECT.

    La sous-requête est alors la solution, car pour ramener la date la plus récente, il faut que tu ailles la lire dynamiquement dans tes données pour la ramener et la tester dans la condition de ta clause WHERE.

    Une solution moins élégante, si les sous-requêtes ne fonctionnent pas : un Order By, avec traitement/affichage de la première ligne uniquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CodeAdv, Domicile, Score, DateMatch
      FROM Match
     ORDER BT DateMatch DESC;
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/02/2008, 09h43
  2. [conception] Requête de sélection problèmes de relations
    Par snoopy69 dans le forum Modélisation
    Réponses: 26
    Dernier message: 08/11/2005, 14h23
  3. [SQL] requête de sélection récursive ? ou impossible ?
    Par toxine dans le forum Langage SQL
    Réponses: 9
    Dernier message: 04/08/2005, 13h20
  4. Réponses: 1
    Dernier message: 03/08/2005, 11h41
  5. Pb de requête de sélection
    Par Nohant dans le forum Langage SQL
    Réponses: 8
    Dernier message: 16/01/2005, 17h51

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