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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    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);

+ 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, 15h53
  2. un COUNT sans GROUP BY
    Par Ekinoks dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/12/2007, 00h38
  3. GROUP_CONCAT sans résultat
    Par ctobini dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/11/2007, 17h26
  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, 20h17
  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, 15h27

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