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 :

Problème avec ORDER BY et GROUP BY


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut Problème avec ORDER BY et GROUP BY
    En fait, il y a un problème avec ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM donnees 
    GROUP BY codeplanteur 
    ORDER BY id DESC
    Le problème est que la requête n’affiche pas le dernier enregistrement lorsqu’il y a plusieurs enregistrements pour le même « code planteur ». Je ne sais pas comment résoudre cette difficulté. Par exemple pour le code planteur « JUSTIN », il y a 2 enregistrements mais au lieu d’afficher celui dont le id=9 c’est celui dont le id=8 qu’il affiche.

    Voici ma table et son contenu afin de vous permettre de mieux m’aider.


    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
    CREATE TABLE `donnees` (
    `id` int(11) NOT NULL auto_increment,
    `motcle` text NOT NULL,
    `codeentreprise` varchar(150) NOT NULL default '',
    `mois` varchar(150) NOT NULL default '',
    `prixAchat` varchar(150) NOT NULL default '',
    `datepaiement` text NOT NULL,
    `codeplanteur` varchar(150) NOT NULL default '',
    `nbrelevement` varchar(150) NOT NULL default '',
    `modepaiement` varchar(150) NOT NULL default '',
    `netpayer` varchar(150) NOT NULL default '',
    `bank` text NOT NULL,
    `poidstotaleleve` varchar(150) NOT NULL default '',
    `tsModif` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `id_2` (`id`),
    KEY `id_3` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;
     
    -- 
    -- Contenu de la table `donnees`
    -- 
     
    INSERT INTO `donnees` VALUES (1, 'PALMAFRIQUE', 'PALMAFRIQUE', 'Janvier', '25', '23-10-2009', 'DADIS', '5', '15000', '127825', '', '1212', '2009-10-23 08:58:45');
    INSERT INTO `donnees` VALUES (2, 'PALMAFRIQUE', 'PALMAFRIQUE', 'Janvier', '25', '23-10-2009', 'KONE', '1', 'Virement', '4545', '', '12', '2009-10-23 08:59:30');
    INSERT INTO `donnees` VALUES (3, 'FFF', '', 'Janvier', '25', 'GGFG', 'FE', '1', 'Virement', 'FFE', 'BICICI', 'FF', '2009-10-23 08:59:30');
    INSERT INTO `donnees` VALUES (4, 'PALMAFRIQUE', 'palmafrique', 'Janvier', '25', '23-10-2009', 'KOFFI', '1', 'Chèque', '8325', 'VERSUS BANK', '333', '2009-10-23 09:08:15');
    INSERT INTO `donnees` VALUES (5, 'PALMAFRIQUE', 'palmafrique', 'Novembre', '25', '23-10-2009', 'KONAN', '15', 'Espece', '300000', 'BICICI', '12000', '2009-10-23 09:10:21');
    INSERT INTO `donnees` VALUES (6, 'PALMAFRIQUE', 'palmafrique', 'Janvier', '25', '23-10-2009', 'KOUASSI', '1', 'Cheque', '25000', 'ECOBANK', '1000', '2009-10-23 09:11:09');
    INSERT INTO `donnees` VALUES (7, 'PALMAFRIQUE', 'palmafrique', 'Mai', '25', '23-10-2009', 'CAMARA', '10', 'Autres', '1581275', 'SGBCI', '63251', '2009-10-23 10:06:15');
    INSERT INTO `donnees` VALUES (8, 'PALMAFRIQUE', 'palmafrique', 'Janvier', '25', '23-10-2009', 'JUSTIN', '1', 'Espece', '36350', 'ECOBANK', '1454', '2009-10-23 10:20:14');
    INSERT INTO `donnees` VALUES (9, 'PALMAFRIQUE', 'palmafrique', 'Janvier', '25', '23-10-2009', 'JUSTIN', '3', 'Espece', '1364675', 'SIB', '54587', '2009-10-23 10:29:56');

    Merci d’AVANCE

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Bonjour,

    L'étoile est à proscrire des requêtes (sauf dans les cas particulier comme COUNT(*)).
    Pourquoi utiliser le GROUP BY ? Qu'est-il supposer apporter ?
    Bref, la question est plutôt de savoir ce que vous voulez faire avec cette requête...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Par défaut
    L'* c'est très bien quand tu veux tous les champs, mais tu utilises un GROUP BY, donc tu ne reçois qu'une seule ligne par valeur de codeplanteur, c'est ce que tu as demandé.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut Problème avec GROUP BY et ORDER BY
    Je m'explique. Il y a pour chaque "code planteur" plusieurs enregistrements. Prenons comme exemple 5 codes planteurs ( JUSTIN, DADIS, YAO, ZATTA, KOFFI….). et donc pour chacun de ces "code planteur", il y a plusieurs enregistrements. Tous ces enregistrements sont stockés dans la table "donnees" qui constitue la table historique ensuite je veux insérer dans la table "actuel" le dernier enregistrement du code planteur "JUSTIN", le dernier enregistrement du code planteur "KOUASSI", le dernier enregistrement du code planteur"YAO",le dernier enregistrement du code planteur"ZATTA",le dernier enregistrement du code planteur"KOFFI",.....
    En fait, la table "actuel" est celle que je mets à la disposition des utilisateurs. La table "donnees" est la table historique qui contient tous les enregistrements sans distinction. Ce que je veux c'est que lorsqu'on ajoute un nouvel enregistrement dans la table "donnees", le système vérifie si le "code planteur" existe dans la table "actuel". S'il existe alors l'ancien enregistrement est écrasée par la nouvelle. S'il n'existe pas alors il est ajouté à la table "actuel". Je veux donc inserer dans la table" actuel", le dernier enregistrement par codeplanteur. C'est à dire le dernier enregistrement di codeplanteur "JUSTIN", le dernier enregistrement du codeplanteur "DADIS" .....
    Aidez moi à mieux formuler ma requête.
    Aidez moi, cela fait plusieurs semaines que je n'arrive pas à mettre une telle requête en place.
    MERCI D'AVANCE

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut Problème avec GROUP BY et ORDER BY
    Je voudrais préciser que ma table"actuel" a la même structure que la table "donnees"
    Merci

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    OK, les choses sont un peu plus clair à présent.

    Pour résoudre votre problème, je vous conseille de jeter un œil du côté de la commande "INSERT INTO... ON DUPLICATE KEY UPDATE...".
    Cette commande permet d'insérer des valeurs dans une table et, si la clé primaire existe déjà, de procéder à une mise à jour des données existantes.

    Plus d'infos dans la documentation MySQL : http://dev.mysql.com/doc/refman/5.1/...duplicate.html

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Par défaut
    Faut pas me l'envoyer en PM

    Citation Envoyé par palmafrique
    Je m'explique. Il y a pour chaque "code planteur" plusieurs enregistrements. Prenons comme exemple 5 codes planteurs ( JUSTIN, DADIS, YAO, ZATTA, KOFFI….). et donc pour chacun de ces "code planteur", il y a plusieurs enregistrements. Tous ces enregistrements sont stockés dans la table "donnees" qui constitue la table historique ensuite je veux insérer dans la table "actuel" le dernier enregistrement du code planteur "JUSTIN", le dernier enregistrement du code planteur "KOUASSI", le dernier enregistrement du code planteur"YAO",le dernier enregistrement du code planteur"ZATTA",le dernier enregistrement du code planteur"KOFFI",.....
    En fait, la table "actuel" est celle que je mets à la disposition des utilisateurs. La table "donnees" est la table historique qui contient tous les enregistrements sans distinction. Ce que je veux c'est que lorsqu'on ajoute un nouvel enregistrement dans la table "donnees", le système vérifie si le "code planteur" existe dans la table "actuel". S'il existe alors l'ancien enregistrement est écrasée par la nouvelle. S'il n'existe pas alors il est ajouté à la table "actuel".
    Aidez moi, cela fait plusieurs semaines que je n'arrive pas à mettre une telle requête en place.
    OK, je comprends mieux.

    D'abord, il faut remplir ta table "actuel" en utilisant le résultat de cette requête, pour les explications voir ici :

    http://dev.mysql.com/doc/refman/5.0/...group-row.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.* 
    FROM donnees a 
    LEFT JOIN donnees b ON a.codeplanteur=b.codeplanteur AND a.id<b.id
    WHERE b.id IS NULL;
    Ceci te donne la liste des derniers enregistrements pour chaque codeplanteur (la requête peut prendre du temps si ta table donnees est grosse).

    Ensuite, à chaque fois que tu insères une ligne dans la table donnees, tu maintiens à jour la table "actuel" qui est en fait un cache de cette requête, avec un UPDATE ou un INSERT.

Discussions similaires

  1. [MySQL] Problème avec ORDER BY
    Par Vianney78 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 15/03/2007, 15h35
  2. Problème avec ORDER BY et champ de type "text"
    Par mouchkar dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/12/2006, 14h38
  3. [Requête]Problème avec ORDER BY NZ
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2006, 20h27
  4. [MySQL] problème avec ORDER BY _ DESC avec des flottants
    Par Hayabusa dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/08/2006, 00h00
  5. problème avec order by et union
    Par ghostdog dans le forum Langage SQL
    Réponses: 8
    Dernier message: 23/05/2006, 09h54

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