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

Requêtes MySQL Discussion :

plusieurs enregistrements dans une seul ligne


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut plusieurs enregistrements dans une seul ligne
    Bonjour

    voilà je suis en train de réaliser en php/mysql une application pour gérer mes mp3 et pouvoir ensuite générer des playlist (lisibles par xmms) répondant à certains critères.
    j'utilise mysql 4.0.22.

    j'ai une table `playlist_files`, une table `artiste`, une table `genre` et une table de jointure `file_genre` car un même fichier peut appartenir à plusieurs genres.

    voilà un résumé de la structure de mes tables et des enregistrements de test.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    mysql> SHOW COLUMNS FROM playlist_files;
    +---------+----------------------+------+-----+---------+----------------+
    | Field   | Type                 | Null | Key | Default | Extra          |
    +---------+----------------------+------+-----+---------+----------------+
    | id      | tinyint(3) unsigned  |      | PRI | NULL    | auto_increment |
    | artiste | smallint(5) unsigned | YES  | MUL | NULL    |                |
    | live    | tinyint(1)           |      |     | 0       |                |
    | dure    | tinyint(3) unsigned  | YES  |     | NULL    |                |
    | name    | tinytext             |      |     |         |                |
    | path    | tinytext             |      |     |         |                |
    +---------+----------------------+------+-----+---------+----------------+
    6 rows in set (0.68 sec)
     
    mysql> SHOW COLUMNS FROM artiste;
    +-------------+----------------------+------+-----+---------+----------------+
    | Field       | Type                 | Null | Key | Default | Extra          |
    +-------------+----------------------+------+-----+---------+----------------+
    | id          | smallint(5) unsigned |      | PRI | NULL    | auto_increment |
    | nom         | varchar(32)          |      |     |         |                |
    | description | tinytext             | YES  |     | NULL    |                |
    +-------------+----------------------+------+-----+---------+----------------+
    3 rows in set (0.01 sec)
     
    mysql> SHOW COLUMNS FROM genre;
    +-------------+----------------------+------+-----+---------+----------------+
    | Field       | Type                 | Null | Key | Default | Extra          |
    +-------------+----------------------+------+-----+---------+----------------+
    | id          | smallint(5) unsigned |      | PRI | NULL    | auto_increment |
    | nom         | varchar(32)          |      |     |         |                |
    | description | tinytext             | YES  |     | NULL    |                |
    +-------------+----------------------+------+-----+---------+----------------+
    3 rows in set (0.02 sec)
     
    mysql> SHOW COLUMNS FROM file_genre;
    +----------+----------------------+------+-----+---------+-------+
    | Field    | Type                 | Null | Key | Default | Extra |
    +----------+----------------------+------+-----+---------+-------+
    | id_genre | smallint(5) unsigned |      | PRI | 0       |       |
    | id_file  | tinyint(3) unsigned  |      | PRI | 0       |       |
    +----------+----------------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    les enregistrements :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    mysql> SELECT * FROM playlist_files;
    +----+---------+------+------+---------------------+-------------+
    | id | artiste | live | dure | name                | path        |
    +----+---------+------+------+---------------------+-------------+
    |  1 |       1 |    0 | NULL | Tourniquet          | /mnt/blabla |
    |  2 |       1 |    0 | NULL | Going Under         | /mnt/truc   |
    |  3 |       2 |    0 | NULL | Fortresse of teares | /mnt/machin |
    +----+---------+------+------+---------------------+-------------+
    3 rows in set (0.00 sec)
     
    mysql> SELECT * FROM artiste;
    +----+-------------+-----------------------------+
    | id | nom         | description                 |
    +----+-------------+-----------------------------+
    |  1 | Evanescence | Les meilleurs des meilleurs |
    |  2 | Him         | Un bon groupe               |
    +----+-------------+-----------------------------+
    2 rows in set (0.00 sec)
     
    mysql> SELECT * FROM genre;
    +----+----------+-------------+
    | id | nom      | description |
    +----+----------+-------------+
    |  1 | rock     | NULL        |
    |  2 | métal    | NULL        |
    |  3 | gothique | NULL        |
    +----+----------+-------------+
    3 rows in set (0.00 sec)
     
    mysql> SELECT * FROM file_genre;
    +----------+---------+
    | id_genre | id_file |
    +----------+---------+
    |        1 |       1 |
    |        2 |       1 |
    |        3 |       1 |
    |        1 |       2 |
    |        2 |       2 |
    |        3 |       2 |
    |        1 |       3 |
    +----------+---------+
    7 rows in set (0.00 sec)
    pour séléctionner des enregistrements selon certains critères c'est assez simple.
    mais moi j'aimerai tout sélectionner (enfin avec une limite quand même) et en particulier avoir tous les genres auquel appartient un fichier.

    j'ai essayé une requête comme ça, mais seul le premier groupe sort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql> SELECT p.name, p.dure, a.nom AS artiste, g.nom AS genre
        -> FROM playlist_files AS p LEFT JOIN artiste AS a ON (p.artiste=a.id)
        -> LEFT JOIN file_genre AS f ON (f.id_file=p.id)
        -> INNER JOIN genre AS g ON (g.id=f.id_genre)
        -> GROUP BY p.id ORDER BY p.name ASC;
    +---------------------+------+-------------+-------+
    | name                | dure | artiste     | genre |
    +---------------------+------+-------------+-------+
    | Fortresse of teares | NULL | Him         | rock  |
    | Going Under         | NULL | Evanescence | rock  |
    | Tourniquet          | NULL | Evanescence | rock  |
    +---------------------+------+-------------+-------+
    et sans le GROUP BY:
    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
    mysql> SELECT p.name, p.dure, a.nom AS artiste, g.nom AS genre
        -> FROM playlist_files AS p LEFT JOIN artiste AS a ON (p.artiste=a.id)
        -> LEFT JOIN file_genre AS f ON (f.id_file=p.id)
        -> INNER JOIN genre AS g ON (g.id=f.id_genre)
        -> ORDER BY p.name ASC;
    +---------------------+------+-------------+----------+
    | name                | dure | artiste     | genre    |
    +---------------------+------+-------------+----------+
    | Fortresse of teares | NULL | Him         | rock     |
    | Going Under         | NULL | Evanescence | rock     |
    | Going Under         | NULL | Evanescence | métal    |
    | Going Under         | NULL | Evanescence | gothique |
    | Tourniquet          | NULL | Evanescence | rock     |
    | Tourniquet          | NULL | Evanescence | métal    |
    | Tourniquet          | NULL | Evanescence | gothique |
    +---------------------+------+-------------+----------+
    ça on pouvais s'y attendre, mais c'est pas ce que je veux.

    moi j'aimerai pouvoir récupérer quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +---------------------+------+-------------+-----------------------+
    | name                | dure | artiste     | genre                 |
    +---------------------+------+-------------+-----------------------+
    | Fortresse of teares | NULL | Him         | rock                  |
    | Going Under         | NULL | Evanescence | rock, métal, gothique |
    | Tourniquet          | NULL | Evanescence | rock, métal, gothique |
    +---------------------+------+-------------+-----------------------+
    mais je ne sais pas du tout si une fonction de mysql permet de le faire ou même si c'est possible.
    dans tous les cas j'aimerais éviter de devoir effectuer une requête par fichier pour récupérer les genres, sinon le nombre de requête risque d'être très important.

    je suis prêt à accepter toutes les propositions quel qu'elle soit; je fais ça pour moi, je n'ai aucune contrainte exterieur.

    voilà, je sais que ça fait un long message avec beaucoup de balise code.
    merci d'être arrivé jusqu'au bout de mon message, et merci aussi à ceux qui m'apporteront de l'aide.

    ps : je sais que le titre est assez maladroit, mais je n'ai rien trouvé de mieux comme titre à mon problème.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  2. #2
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Moi je trouve ton titre correct. Le plus simple pour ce problème, c'est d'utiliser l'avant-dernière requête (sans le group by) et de te créer tes chaînes de caractères par programmation en PHP.

  3. #3
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Salut,
    Tien je ne suis pas le seul insomniac du forum. ^^

    En fait le regardant la liste des threads, je trouvais mon titre peu explicite un peu comme le titre des chapitres en cours.


    Si je comprends bien ta solution, il faudrai que pour chaque ligne que je récupère, je test si p.id est égale au p.id précédent, si oui alors on concatène le genre, sinon on affiche les informations.

    Ça m'a l'aire d'être une bonne solution, je ne sais pas encore comment je vais materialiser ça sous forme de code, et à vrai dire je verrais ça dans une 10ene d'heures.

    (franchelement je me demande comment j'ai fait pour ne pas penser à ça).


    Voilà, un grand merci laffreuxthomas.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  4. #4
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Tu peux peut-être utiliser la fonction GROUP_CONCAT() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT p.name, p.dure, a.nom AS artiste,
     
    GROUP_CONCAT(g.nom
     ORDER BY g.nom DESC SEPARATOR ',') AS genres
     
    FROM playlist_files AS p LEFT JOIN artiste AS a ON (p.artiste=a.id)
    LEFT JOIN file_genre AS f ON (f.id_file=p.id)
    INNER JOIN genre AS g ON (g.id=f.id_genre)
    GROUP BY p.id ORDER BY p.name ASC;
    Après c'est sûr que les SGBD n'ont pas pour rôle principal de faire du "cosmétique"... Comme dit laffreuxthomas, c'est plutôt le boulot du langage de programmation.

    http://dev.mysql.com/doc/mysql/en/GROUP-BY-Functions.html
    Pensez au bouton

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

Discussions similaires

  1. [AC-2007] Probleme pour Concaténer plusieurs enregistrements dans une seule colonne
    Par severik dans le forum Requêtes et SQL.
    Réponses: 23
    Dernier message: 08/11/2017, 15h15
  2. Réponses: 4
    Dernier message: 29/10/2010, 17h05
  3. Réponses: 6
    Dernier message: 23/02/2008, 11h17
  4. [XI] Plusieurs enregistrements en une seule ligne
    Par KaNos_Isterik dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 21/03/2007, 11h33
  5. Réponses: 2
    Dernier message: 29/03/2006, 16h36

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