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 :

group_concat sans groupe


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut group_concat sans groupe
    Bonjour,
    j'ai une simple table de scores:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DROP TABLE IF EXISTS `votes`;
    CREATE TABLE IF NOT EXISTS `votes` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `score` varchar(8) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO `votes` (`id`, `score`) VALUES
    (1, '160'),
    (2, '100'),
    (3, '120'),
    (4, '100'),
    (5, '140'),
    (6, '100');
    Je voudrais pouvoir obtenir la liste des 3 meilleurs scores, sous la forme 1,5,3. Donc j'essaye:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT GROUP_CONCAT( DISTINCT CAST(id AS CHAR) SEPARATOR "," ) AS scid 
    FROM `votes` 
    WHERE 1 
    ORDER BY `score` DESC LIMIT 3;
    Ce qui ne marche pas. probablement car je n'ai pas de groupe défini.

    Comment puis je faire pour obtenir cette des 3 premiers résultats en une seule requete ?

    Merci d'avance

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    comme ceci peut être ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select GROUP_CONCAT( DISTINCT CAST(tmp.id AS CHAR) SEPARATOR "," ) as scid
    FROM
    (SELECT id  
    FROM `votes` 
    WHERE 1 
    ORDER BY `score` DESC LIMIT 3) tmp ;

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Merci la requete renvoit bien maintenant la liste des id concernés.

    Maintenant je me heurte à un nouveau pb.
    J'ai la table suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DROP TABLE IF EXISTS `voter`;
    CREATE TABLE IF NOT EXISTS `voter` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(32) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO `voter` (`id`, `nom`) VALUES
    (1, 'laurent'),
    (2, 'eric'),
    (3, 'marion'),
    (4, 'sylvie'),
    (5, 'jacques'),
    (6, 'richard');
    Et je voulais afficher les noms des meilleurs scores.
    donc je pensais à la requete suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT nom FROM `voter` WHERE `id` IN (
    SELECT GROUP_CONCAT( DISTINCT CAST(tmp.id AS CHAR) SEPARATOR "," ) AS scid
    FROM
    (SELECT id  
    FROM `votes` 
    WHERE 1 
    ORDER BY `score` DESC LIMIT 3) tmp);
    Mais bizaremment celle-ci me renvoit que 'laurent' comme résultats. Alors que je devrais à avoir les trois enregistrements 'laurent', 'jacques','marion'.

    Où est l'erreur ? D'avance merci. Je suis sous Mysql 5.0

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    il faut faire le group_concat au niveau du nom plutôt qu'au niveau de l'id dans ce cas

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Non ici le fait que l'id de l'utilisateur soit identique à l'id du score est un pur hazard.
    En fait l'exemple plus probant consiste à rajouter un userid dans la table score.
    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
    DROP TABLE IF EXISTS `votes`;
    CREATE TABLE IF NOT EXISTS `votes` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `userid` int(11) NOT NULL,  
      `score` varchar(8) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
     
    INSERT INTO `votes` (`id`, `userid`, `score`) VALUES
    (1, 3, '160'),
    (2, 5, '100'),
    (3, 2, '120'),
    (4, 4, '100'),
    (5, 1, '140'),
    (6, 6, '100');
     
    DROP TABLE IF EXISTS `voter`;
    CREATE TABLE IF NOT EXISTS `voter` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(32) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
     
    INSERT INTO `voter` (`id`, `nom`) VALUES
    (1, 'jacques'),
    (2, 'marion'),
    (3, 'laurent'),
    (4, 'sylvie'),
    (5, 'eric'),
    (6, 'richard');
    Dans ce cas la requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT nom FROM `voter` WHERE `id` IN (
    SELECT GROUP_CONCAT( DISTINCT CAST(tmp.userid AS CHAR) SEPARATOR "," ) AS scid
    FROM
    (SELECT userid  
    FROM `votes` 
    WHERE 1 
    ORDER BY `score` DESC LIMIT 3) tmp);
    ramene 'laurent' seul alors qu'on devrait avoir:

    laurent
    jacques
    marion

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    ce que je voulais dire , c'est quelque chose dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT group_concat(nom) FROM `voter` WHERE `id` IN (
    SELECT userid
    FROM
    (SELECT userid  
    FROM `votes` 
    WHERE 1 
    ORDER BY `score` DESC LIMIT 3) tmp);

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Super, cela marche nickel.
    Par contre je ne comprends plus trop le sens de la clause IN. Je croyais que la recherche se faisait dans une liste de valeurs 3,1,2 or là la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT userid
    FROM (
     
    SELECT userid
    FROM `votes`
    WHERE 1
    ORDER BY `score` DESC
    LIMIT 3
    )tmp
    renvoit 3 enregistrements.

    En tous cas merci pour ton aide.

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

Discussions similaires

  1. agregation sans group by comment faire ?
    Par maysa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/12/2007, 14h53
  2. un COUNT sans GROUP BY
    Par Ekinoks dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/12/2007, 23h38
  3. GROUP_CONCAT sans résultat
    Par ctobini dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/11/2007, 16h26
  4. Récupérer un min d'un champ, sans group by
    Par amalane dans le forum Requêtes
    Réponses: 0
    Dernier message: 22/07/2007, 19h17
  5. Requête récalcitrante avec un tri par COUNT sans GROUP BY
    Par Ancalagon77 dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/10/2006, 14h27

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