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

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 1
    Points
    1
    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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    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

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Points : 88
    Points
    88
    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 Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 1
    Points
    1
    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 Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 1
    Points
    1
    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
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Points : 88
    Points
    88
    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.

  7. #7
    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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    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

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Problème avec GROUP BY et ORDER BY
    Ok? je vous remercie. Je vais suivre vos recommandations et vous donner la suite
    Cordialement

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Points : 88
    Points
    88
    Par défaut
    En fait il palmafrique veut faire une "materialized view" mais attention, INSERT ON DUPLICATE KEY UPDATE peut poser des problèmes en cas d'insert concurrent, est-ce vraiment la ligne la plus récente qui sera mise en cache ?... (hé oui car on ne peut pas mettre de condition dans le ON DUPLICATE KEY UPDATE)

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Problème avec GROUP BY et ORDER BY
    Merci peufeu, votre requête est nikel. C'est exactement ce que je s voulais faire depuis plusieurs semaines sans succès. Dieu vous bénisse et bénisse tous ces bénévoles qui animent ce site.
    Maintenant, je vais explorer la proposition de modérateur.
    Je vous tiens informé.
    Cordialement

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Problème avec GROUP BY et ORDER BY
    C'est encore moi. J'ai encore quelques soucis avec ma requête.
    Pour l'insertion du résultat de la requête dans la table"actuel", l'insertion se passe bien lorsque j'applique cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO actuel (id, motcle, codeentreprise, mois, prixAchat, datepaiement, codeplanteur, modepaiement, nbrelevement, netpayer, bank, poidstotaleleve, tsModif)
    SELECT a. *
    FROM donnees a
    LEFT JOIN donnees b ON a.codeplanteur = b.codeplanteur
    AND a.id < b.id
    WHERE b.id IS NULL
    Par elle ne me permet pas de faire une mise à jour automatique.

    Lorsque j'utilise "ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)" dans ma requête MYSQL retourne une message d'erreur.
    Voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO actuel( id, motcle, codeentreprise, mois, prixAchat, datepaiement, codeplanteur, modepaiement, nbrelevement, netpayer, bank, poidstotaleleve, tsModif )
    ON DUPLICATE
    KEY UPDATE id = LAST_INSERT_ID( id ) 
    SELECT a. *
    FROM donnees a
    LEFT JOIN donnees b ON a.codeplanteur = b.codeplanteur
    AND a.id < b.id
    WHERE b.id IS NULL
    Et voici la réponse d'erreur de MYSQL:

    #1064 - Erreur de syntaxe pr�s de 'ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)
    SELECT a. *
    FROM' � la ligne 3
    Je pense qu'il doit avoir des erreurs dans la formulation de ma requête. Aidez moi à la corriger. Je précise que mon champs "id" est auto-incrémenté
    Merci d'avance

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Points : 88
    Points
    88
    Par défaut
    OK, je vois.

    La grosse requête sert à remplir initialement la table "actuel". Par contre, pour ajouter un seul enregistrement, il faut :

    1) insérer 1 nouvelle ligne dans données

    INSERT INTO donnees ( motcle, codeentreprise, mois, prixAchat, datepaiement, codeplanteur, modepaiement, nbrelevement, netpayer, bank, poidstotaleleve, tsModif ) VALUES (...)

    2) récupérer son id dans une variable (en php)

    $id = mysql_insert_id()

    3) maintenant que tu connais l'id, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO actuel( id, motcle, codeentreprise, mois, prixAchat, datepaiement, codeplanteur, modepaiement, nbrelevement, netpayer, bank, poidstotaleleve, tsModif )
    VALUES ( les mêmes qu'à la précédente mais avec id en plus )
    ON DUPLICATE
    KEY UPDATE 
    id = VALUES( id )
    motcle = VALUES( motcle )
    ... etc pour toutes les colonnes ...

    je précise que la table actuel doit avoir "codeplanteur" en clé primaire, pas id, puisque l'id provient de la table données et que dans "actuel" tu n'as qu'un seul enregistrement par codeplanteur.

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Problème avec GROUP BY et ORDER BY
    OK MERCI peufeu. Je vais faire ce que vous venez de me conseiller et je vous tiens informer du résultat.
    Merci encore une fois pour ta disponibilité.

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