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 :

Renvoyer les n éléments de chaque catégorie


Sujet :

Requêtes MySQL

  1. #1
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut Renvoyer les n éléments de chaque catégorie
    bonjour,

    j'ai cette requête adaptée des sources de ce forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT imp_usine, imp_mg FROM indext.tbl_import e WHERE (SELECT COUNT(*)FROM indext.tbl_import e1 WHERE e1.imp_mg = e.imp_mg AND e1.imp_usine < e.imp_usine) < 2
    je veux récupérer les 2 premier imp_mg de chauqe imp_usine

    or ma requête mouline et voilà rien ça ne fait que mouliner

    pour info, j'ai fait la même chose sous access et pareil voir post
    http://www.developpez.net/forums/d89...e/#post5097608

    je pensais qu'avec access c'était un problème de taille de table (200 000 lignes), mais j'ai refait la même base sous mysql avec seulement 13000 enregistrements et même chose!?

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    c'est à dire que dans le forum Access, tu voulais:

    Citation Envoyé par elnipal
    ...obtenir les 10 plus grands résultats de imp_MG pour chaque imp_usine
    or en écrivant:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ...WHERE (SELECT COUNT(*)FROM indext.tbl_import e1 WHERE e1.imp_mg = e.imp_mg AND e1.imp_usine < e.imp_usine) < 2

    tu fais l'inverse, c'est à dire les 10 plus grands résultats de imp_usine pour chaque imp_mg.

    c'est confus...

  3. #3
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    autant pour moi, c'est effectivement l'inverse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (SELECT COUNT(*)FROM indext.tbl_import e1 WHERE e1.imp_usine = e.imp_usine AND e1.imp_mg< e.imp_mg) < n
    mais cela ne change rien au fait que ça occupe le pc un bon moment................ un très bon moment

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ta table est-elle indexée ?
    Notamment les colonnes imp_usine et imp_mg.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    voici la structure de la table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE `tbl_import` (
     `imp_annee` double NOT NULL,
     `imp_mois` double NOT NULL,
     `imp_decade` double NOT NULL,
     `imp_tournee` double NOT NULL,
     `imp_prod` double NOT NULL,
     `imp_usine` double NOT NULL,
     `imp_matricule` double NOT NULL,
     `imp_mg` float NOT NULL,
     `imp_ecart` float DEFAULT NULL,
     UNIQUE KEY `nipal` (`imp_annee`,`imp_mois`,`imp_decade`,`imp_tournee`,`imp_prod`,`imp_usine`,`imp_matricule`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Avec cette clé UNIQUE, il y a :
    - Le groupe de 10 colonnes qui est indexé ;
    - La première colonne de ce groupe, c'est à dire imp_annee.

    imp_usine et imp_mg ne sont pas indexées en dehors du groupe donc l'index UNIQUE ne peut pas être utiliser pour mettre en relation les valeurs de imp_usine et imp_mg.

    Pour ta requête, il faut ajouter des index sur ces deux colonnes.

    J'ajouterai que le type des colonnes est quelque peu curieux ! Une année, un mois, une décade seront très bien définis par un entier par exemple !

    Vu le nom de la table, il semble qu'il s'agisse d'un import de données. J'espère que cette table n'est pas utilisée en production tel quel ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    Effectivement, il s'agit d'une table utilisée à titre d'essai,avec un import en masse de données provenant de fichiers csv via un script en php
    je ne sais pas si un jour je mettrais cela à disposition ou non, pour l'instant elle me sert d'une part à me familiariser avec mysql (sgbd avec lequel je débute) et d'autre part à me faire des stats pour moi perso.

    la structure est loin d'être optimale, j'en suis bien conscient, et pourrait peut être ressembler à ça
    pour une imp_usine , il y a n imp_tournee (avec imp_annee, imp_mois, imp_decade, imp_prod)
    pour une imp_tournee, il y a n imp matricule (avec imp_mg, imp_ecart - pas encore utilisé et qui consiste à calculer la différence entre 2 imp_mg consécutif pour le même imp_matricule, sachant que le matricule peut changer de imp_tournee et même de imp_usine!!-))

    De cette manière, aurais-je moins de mal à retrouver un top n de imp_mg pour chaque imp_usine??

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si le volume de données est important, normaliser cette table unique en véritable base de données est un très bon exercice et te permettra d'optimiser les temps de réponse pour tes statistiques.

    À l'INRA, j'ai eu cet exercice à faire avec 2 ans de données sur les bovins. Il y avait, si je me souviens bien, 6 CD de données en format texte et le tout se rassemblait dans environ 5 tables dont certaines comportaient des dizaines de millions de lignes.

    J'ai créé une BDD normalisée à partir de ces fichiers et il fallait ensuite des requêtes assez complexes pour dépasser les 10 secondes de temps de réponse. Les requêtes simples donnaient la réponse en moins d'une seconde.

    Voici un exemple d'extraction de données de la BDD pour catégoriser les une partie des bovins :
    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
    # Exploitations � veau gras avec vaches V/ND et pas de vache L/M
    CREATE TABLE bdni2.exp_vg4
    SELECT e.B_D_FK_IND_EXP
    FROM bdni2.exp_vg e
    WHERE EXISTS(
        SELECT *
        FROM bdni2.detentions d 
        INNER JOIN bdni2.bovins b ON d.B_D_FK_IND_BOVINS = b.B_IND_BOVIN
        WHERE d.B_D_FK_IND_EXP = e.B_D_FK_IND_EXP
            AND b.B_FK_Ind_CategorieFinale BETWEEN 2 AND 5
            AND b.B_FK_TYPE_RACIAL IN (2, 4)
        )
        AND NOT EXISTS(
            SELECT *
            FROM bdni2.detentions d 
            INNER JOIN bdni2.bovins b ON d.B_D_FK_IND_BOVINS = b.B_IND_BOVIN
            WHERE d.B_D_FK_IND_EXP = e.B_D_FK_IND_EXP
                AND b.B_FK_Ind_CategorieFinale BETWEEN 2 AND 5
                AND b.B_FK_TYPE_RACIAL IN (1, 3)
            );
    De mémoire, la table des détentions faisait 65 millions de lignes.

    Cette normalisation m'a permis aussi de découvrir des incohérences dans les données, parfois assez comiques.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 8
    Dernier message: 18/05/2013, 15h21
  2. [AC-2007] Renvoyer les n éléments de chaque catégorie
    Par triaguae dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 19/04/2010, 14h28
  3. Réponses: 3
    Dernier message: 07/03/2010, 20h50
  4. Récupérer les dernier articles de chaque catégories
    Par bobic dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/12/2008, 16h12
  5. Réponses: 2
    Dernier message: 07/03/2007, 16h30

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