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 :

Trier le résultat en fonction du nombre d’occurrence des éléments


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut Trier le résultat en fonction du nombre d’occurrence des éléments
    Trier le résultat en fonction du nombre d’occurrence des éléments

    Bonjour à tous

    Voila si je suis ici, c’est que j’ai un peut problème avec une requête.

    Tout d’abord l’environnement : je travail en php/MySQL
    (Mais je tien à préciser que (à priori) le problème est totalement indépendant du contexte)

    La requête :
    Récupérer tout les élément de la table trier par ordre d’apparition de valeur d’un certain champ ……
    (Je sais ça veut pas dire grand-chose..) (Alors voila un exemple)


    Table foo
    Attribut : id Att
    1 rouge
    2 rouge
    3 vert
    4 bleu
    5 vert
    6 jaune
    7 vert
    8 noir
    9 vert

    Et voila le résultat que je voudrais avoir :
    id Att
    3 vert Les verts en premiers
    5 vert car il sont les plus nombreux
    7 vert
    9 vert
    1 rouge puis les rouges
    2 rouge
    4 bleu Enfin les autres
    6 jaune
    8 noir

    Pour le moment tous ce que j’arrive à faire c’est tout récupéré et après je me perd dans des traitement php …

    Donc je cherche le moyen de faire ça d’un coup en SQL.

    JE continu de chercher du coté du GROUPE BY, ORDER BY et Count( ) mais tout mélanger c’est dur ^^

    Merci @ tous par avance.
    Orthographe => Message Privé constructif svp

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Il faut trier sur le nombre d'éléments pour chaque Id, donc le calculer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT   c.Id
          ,  a.Att
    FROM  matable  AS a
       INNER JOIN
          (  SELECT   Id
                   ,  COUNT(*) AS compte
             FROM     matable
             GROUP BY Id
          )  AS c
          ON a.Id = c.Id
    ORDER BY c.compte DESC
          ,  c.Id
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.ID, a.Att
    FROM Foo a INNER JOIN Foo b
                       ON a.Att = b.ATT
    GROUP BY a.ID, a.Att
    ORDER BY COUNT(*) DESC, a.Att, a.ID
    Grillé, mais c'est une autre solution
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  4. #4
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut .. je suis null en SQL ....
    Houha .... j'aurais jamais trouvé ça tout seul .... Merci ..

    J'apport un complément d'information et surtout la situation réel.

    Tout d'abord : le shémat de la base de donnée réellement utilisé.
    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
    -- 
    -- Table structure for table `contact`
    -- 
     
    CREATE TABLE `contact` (
      `id_contact` int(10) unsigned NOT NULL auto_increment,
      `nom` text NOT NULL,
      `prenom` text NOT NULL,
      `ville` text NOT NULL,
      `adresse` text NOT NULL,
      `societe` text NOT NULL,
      `email` text NOT NULL,
      `telephone` text NOT NULL,
      `fax` text NOT NULL,
      `langue` text NOT NULL,
      `connu` text NOT NULL,
      `raison` text NOT NULL,
      `financement` text NOT NULL,
      `message` text NOT NULL,
      `date` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`id_contact`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
     
    -- 
    -- Dumping data for table `contact`
    -- 
     
    INSERT INTO `contact` VALUES (1, 'remy', 'li', '', '', '', 'remy@digitalcube.net', '0605040302', '', 'anglais', 'autre', 'trouver un emploi', 'entreprise', 'message', '2006-07-20 10:21:54');
    INSERT INTO `contact` VALUES (2, 'remy', 'li', '', '', '', 'remy@digitalcube.net', '0605040302', '', 'anglais', 'autre', 'trouver un emploi', 'entreprise', 'message', '2006-07-20 10:32:19');
    INSERT INTO `contact` VALUES (3, 'remy', 'li', '', '', '', 'remy@digitalcube.net', '0605040302', '', 'chinois', 'autre', 'trouver un emploi', 'entreprise', 'message', '2006-07-20 10:32:44');
    INSERT INTO `contact` VALUES (4, 'remy', 'li', '', '', '', 'remy@digitalcube.net', '0605040302', '', 'anglais', 'autre', 'trouver un emploi', 'entreprise', 'message', '2006-07-20 10:32:53');
    INSERT INTO `contact` VALUES (5, 'remy', 'li', '', '', '', 'remy@digitalcube.net', '0605040302', '', 'francais langue etrangere', 'autre', 'trouver un emploi', 'entreprise', 'message', '2006-07-20 10:33:04');
    INSERT INTO `contact` VALUES (6, 'remy', 'li', '', '', '', 'remy@digitalcube.net', '0605040302', '', 'chinois', 'autre', 'trouver un emploi', 'entreprise', 'message', '2006-07-20 10:33:12');
    INSERT INTO `contact` VALUES (7, 'remy', 'li', '', '', '', 'remy@digitalcube.net', '0605040302', '', 'portugais du bresil', 'autre', 'trouver un emploi', 'entreprise', 'message', '2006-07-20 10:33:21');
    INSERT INTO `contact` VALUES (8, 'remy', 'li', '', '', '', 'remy@digitalcube.net', '0605040302', '', 'anglais', 'autre', 'trouver un emploi', 'entreprise', 'message', '2006-07-20 10:33:30');


    Ensuite le code dans le quel la requête est effectué
    ( $filtre est une variable php qui prend comme valeur le nom d'une des colonnes. (remplacer $filtre par langue))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $sql = "
    SELECT   *
    FROM  contact  AS a
       INNER JOIN
          (  SELECT   id_contact
                   ,  COUNT(*) AS compte
             FROM     contact
             GROUP BY id_contact
          )  AS c
          ON a.id_contact = c.id_contact
    ORDER BY c.compte DESC
          ,  c.id_contact
    ;";
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $sql = "
    SELECT *
    FROM contact a INNER JOIN contact b
                       ON a.$filtre = b.$filtre
    GROUP BY a.id_contact, a.$filtre
    ORDER BY COUNT(*) DESC, a.$filtre, a.id_contact
    ;";

    La premiére requéte proposé par al1_24 donne un résultat vide.

    celle de Médiat me donne une erreur

    ERREUR SQL

    SELECT *
    FROM contact a INNER JOIN contact b
    ON a.langue = b.langue
    GROUP BY a.id_contact, a.langue
    ORDER BY COUNT(*) DESC, a.langue, a.id_contact
    ;

    Utilisation invalide de la clause GROUP
    Orthographe => Message Privé constructif svp

  5. #5
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut
    Ha non la requête de al1_24 retourne bien un résultat ... mais le même que SELECT * FROM contact ........

    ps : vos requêtes sont trop complex pour moi, j'ais trop du mal à les modifier..
    Orthographe => Message Privé constructif svp

  6. #6
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut
    Bingo !!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT   *
    FROM  contact  AS a
       INNER JOIN
          (  SELECT   id_contact
    	  			, $filtre
                    , COUNT(*) AS compte
             FROM     contact
             GROUP BY $filtre
          )  AS c
          ON a.$filtre = c.$filtre
    ORDER BY c.compte DESC
    ;
    Je comprend pas comment et pourquoi mais ça donne le bon résultat.

    Merci à Médiat et al1_24

    Bye ;-)
    Orthographe => Message Privé constructif svp

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Toutes mes excuses...
    J'ai inversé les colonnes Att et Id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT   a.Id
          ,  a.Att
    FROM  matable  AS a
       INNER JOIN
          (  SELECT   x.Att
                   ,  COUNT(*) AS compte
             FROM     matable AS x
             GROUP BY x.Att
          )  AS c
          ON a.Att = c.Att
    ORDER BY c.compte DESC
          ,  c.Id
    ;
    Ça doit beaucoup mieux marcher comme ça
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/10/2014, 16h13
  2. [Toutes versions] Résultat en fonction du nombre de checkbox cochées
    Par motais dans le forum VBA Word
    Réponses: 1
    Dernier message: 02/10/2011, 21h50
  3. Réponses: 7
    Dernier message: 21/07/2010, 15h47
  4. Réponses: 3
    Dernier message: 23/12/2009, 20h11
  5. [MySQL] Trier les résultats en fonction d'une colonne ordre
    Par eclipse012 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 05/01/2007, 13h59

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