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 :

[MySQL 4.0] Question sur GROUP BY


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Fabouney
    Invité(e)
    Par défaut [MySQL 4.0] Question sur GROUP BY
    bonjour à tous et à toute,

    j'ai 2 tables comme ceci :

    TABLE "SONG" : id (clé)
    TABLE "SONG_FILE" : id (clé), song_id (clé étrangere ID de SONG) track_type (int)

    un SONG contient 0 ou plusieurs SONG_FILE

    relation relativement simple, comme vous pouvez le voir.

    ce que je souhait effectué comme requête.

    je veux parcourir tout les SONG_FILE groupé par SONG, et extraire ceux, dont le track_type est égal au max(track_type) du group SONG

    alors en fait j'avais procédé ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT sf.id,  s.id, track_type, max(track_type) as max_track 
    FROM song_file AS sf
    LEFT JOIN song AS s ON sf.song_id = s.id 
    WHERE sf.seller_id =1 
    AND TYPE =1 
    GROUP BY song_id
    HAVING track_type = max_track
    il compare pas chaque SONG_FILE par rapport au max(track_type) du group SONG en procédant comme ceci :/

    si vous avez éventuellement des solutions.

    petit exemple de ce que ca doit donner :

    avant la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ID      SONG_ID      TRACK_TYPE
    145    5400            3
    146    5400            1
    147    5400            1
    178    3600            2
    177    3600            1
    apres la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID      SONG_ID      TRACK_TYPE       MAX_TRACK
    145    5400            3                      3            
    178    3600            2                      2
    Merci pour votre aide les gars
    Dernière modification par Fabouney ; 24/09/2006 à 18h58.

  2. #2
    Membre confirmé Avatar de crovette51101
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 73
    Par défaut
    bonjour,
    j'ai deja rencontrer un probleme similaire, je vais te donner une technique pas trés commode (plutot armoire ) mais qui a porté ses fruits, mais je te conseille tout de suite de dupliqué ta table pour faire un test, alors la technique consiste a supprimer les doublons par une méthode pas commode non plus aprés avoir rangé ta table par ordre croissant sur le song id et decroissant sur le track type (dans cette ordre!), ce qui donne:

    SELECT ID, song_ID ,Track_Type
    FROM table
    ORDER BY song_ID, Track_Type desc;

    Mais ce n'est pas fini car la tu aura juste ajouter tes chanson par ordre croissant de song id et decroissant de track type, maintenant, il faut virer les doublons, pour cela tu va dans la table que tu va remplir et tu met le champs "song id" en clé primaire comme ca il va supprimer tous les doublons!!!
    hihihi fallait y penser!

    tiens moi au courrant mais normalement ca marche meme si la manip parrait un peu barbare

  3. #3
    Fabouney
    Invité(e)
    Par défaut
    Citation Envoyé par crovette51101
    Mais ce n'est pas fini car la tu aura juste ajouter tes chanson par ordre croissant de song id et decroissant de track type, maintenant, il faut virer les doublons, pour cela tu va dans la table que tu va remplir et tu met le champs "song id" en clé primaire comme ca il va supprimer tous les doublons!!!
    hihihi fallait y penser!
    je comprend ta requête c'est plutot astucieux, mais je comprend pas la 2eme partie, pour virer les doublons.
    si tu peux être un peu plus clair.
    mais je reste tout de même persuader qu'avec un simple GROUP BY cela est réalisable.

  4. #4
    Membre confirmé Avatar de crovette51101
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 73
    Par défaut
    en fait ton group by va servir, je pense si tu aurai voulu additionner un champs, or la ce n'est pas le cas, ma deuxieme parti va supprimer tous les doublons en ne gardant que le premier de la liste, donc celui que tu cherches!
    je m'explique, avec la premiere partie ca donne:
    1 5000 3
    2 5000 2
    3 5000 1
    4 5400 3
    5 5400 1
    6 5400 1
    7 6000 2
    8 6000 1...
    en supprimant les doublons comme je te les montré, tu obtiendras:
    1 5000 3
    2 5400 3
    3 6000 2

    voili,voilou!

    alors ca marche?

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    il faut faire une sous-requête sur SONG_FILE, en récupérant le MAX de la valeur de track_type par song_id, et faire une jointure dessus.

    Voici un jeu d'essai, sous Oracle (mais cela ne devrait poser aucun problème d'adaptation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE TABLE SONG (
    id NUMBER (4));
     
    CREATE TABLE SONG_FILE (
    id NUMBER (4),
    song_id NUMBER (4),
    track_type NUMBER (4));
     
    INSERT INTO SONG VALUES (5400);
    INSERT INTO SONG VALUES (3600);
     
    INSERT INTO SONG_FILE VALUES (145, 5400, 3);
    INSERT INTO SONG_FILE VALUES (146, 5400, 1);
    INSERT INTO SONG_FILE VALUES (147, 5400, 1);
    INSERT INTO SONG_FILE VALUES (178, 3600, 2);
    INSERT INTO SONG_FILE VALUES (177, 3600, 1);
    Et la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL> SELECT sf.id, sf.song_id, sf.track_type
      2     FROM SONG_FILE sf
      3    WHERE sf.track_type = (SELECT MAX(track_type)
      4                             FROM SONG_FILE sfmax
      5                           WHERE sfmax.song_id = sf.song_id);
     
            ID    SONG_ID TRACK_TYPE
    ---------- ---------- ----------
           145       5400          3
           178       3600          2
    Par contre, cette requête ne t'assure pas l'unicité de ton sf.id : en effet, si plusieurs enregistrements ont la même valeur pour le champ track_type, et que cette valeur correspond au MAX, alors tu récupéreras toutes ces lignes.

    pour t'en convaincre, je rajoute cette ligne à mon jeu d'essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO SONG_FILE VALUES (148, 5400, 3);
    Et voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> SELECT sf.id, sf.song_id, sf.track_type
      2     FROM SONG_FILE sf
      3    WHERE sf.track_type = (SELECT MAX(track_type)
      4                             FROM SONG_FILE sfmax
      5                           WHERE sfmax.song_id = sf.song_id);
     
            ID    SONG_ID TRACK_TYPE
    ---------- ---------- ----------
           145       5400          3
           178       3600          2
           148       5400          3
    "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

  6. #6
    Membre confirmé Avatar de crovette51101
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 73
    Par défaut
    bien jouez Xo, sa semble plus dans les normes seulement ca parait un peu plus complexe que moi pour un resultat qui garde des doublons alors que le mien non, enfin, laissons le choix au demandeur!
    mais c'est une bonne astuce!

  7. #7
    Fabouney
    Invité(e)
    Par défaut
    Merci pour ta réponse Xo, en effet, j'avais fait ca tout au début. sa pose aucun pb.
    seulement le serveur ou est hébergé le site est sous mysql 4.0, donc requête imbriquées impossible, c'est pouquoi je demande une solutions avec le group by.
    crovette, j'ai compris lol, mais comment tu t'y prend pour supprimer les doublons.

Discussions similaires

  1. question sur groupe policy preference
    Par adel87 dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 18/09/2014, 10h12
  2. question sur GROUP CONCAT
    Par Dranak dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/07/2008, 16h04
  3. [MySQL] Question sur les GROUP BY
    Par Coladin dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/04/2006, 14h25
  4. [Mysql] [eclipse] questions sur l'installation
    Par sandusa dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 18/03/2004, 11h26

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