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 :

Compter une seule fois une donnée


Sujet :

Requêtes MySQL

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut Compter une seule fois une donnée
    Bonsoir,

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT maj_etat_civil.id_type_adresse, COUNT( * )
    FROM t_users_dossiers
    LEFT OUTER JOIN maj_etat_civil ON t_users_dossiers.id_maj = maj_etat_civil.id_maj
    WHERE maj_etat_civil.id_trt
    BETWEEN 1
    AND 4
    GROUP BY maj_etat_civil.id_type_adresse
    Mon objectif est de connaître le nombre de dossiers (maj_etat_civil) par type d'adresse (id_type_adresse). Et cela que pour les dossiers transmis à au moins un utilisateur (t_users_dossiers).

    Ma requête tel qu'elle est faite me compte autant de fois que d'utilisateur pour un même dossier; Si le dossier 1 est confié à A, B, C. COUNT(*) me comptera 3 alors qu'en fait je n'ai qu'un seul dossier.

    Comment ne compter que le nombre de dossier sans multiplier par le nombre de user sur un dossier.

    Merci d'avance.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 029
    Points : 23 748
    Points
    23 748
    Par défaut
    Bonjour,

    Est-ce que la requête suivante fait ce qu'il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select id_type_adresse, count(id_maj) from maj_etat_civil where id_maj in (
        select distinct mec.id_maj as im
        from maj_etat_civil mec
        inner join t_users_dossiers tud on mec.id_maj = tud.id_maj 
        where mec.id_trt between 1 and 4
    )
    group by id_type_adresse


    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 extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Merci.

    L'approche est peut-être bonne, mais il me fait une erreur :

    #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT DISTINCT mec.id_maj AS im
    FROM maj_etat_civil mec
    Prise séparément les 2 requêtes fontionne bien, mais ensemble, j'ai l'erreur ci-dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT id_type_adresse, count( maj_etat_civil.id_maj )
    FROM maj_etat_civil
    WHERE maj_etat_civil.id_maj
    IN (
     
    SELECT DISTINCT mec.id_maj AS im
    FROM maj_etat_civil mec
    INNER JOIN t_users_dossiers tud ON mec.id_maj = tud.id_maj
    WHERE mec.id_trt
    BETWEEN 1
    AND 4
    )
    GROUP BY id_type_adresse
    J'ai regardé la doc pour la syntaxe, "IN" attend un tableau. le tableau doit être du type array(a,b,c,d).

    Donc je ne vois pas où peut se situer le problème.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 743
    Points
    11 743
    Par défaut
    Attention, les sous-requêtes ne sont acceptées qu'à partir de la version 4.1.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Je suis en 4.0.25. Il faut que je trouve une autre solution. Merci...

    ...Je n'ai pas d'autres solutions que de faire 2 requêtes ?
    Faire un "distinct" ne m'apporte pas la solution non plus, un max(1) non plus...

    ...And the winner is

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_type_adresse, count( DISTINCT t_users_dossiers.id_maj )
    FROM t_users_dossiers
    LEFT OUTER JOIN maj_etat_civil ON t_users_dossiers.id_maj = maj_etat_civil.id_maj
    GROUP BY id_type_adresse
    merci beaucoup
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 029
    Points : 23 748
    Points
    23 748
    Par défaut
    Bien joué, belle optimisation...

    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 extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    ça fait toujours plaisir.

    Merci Ced
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/04/2013, 15h57
  2. Réponses: 6
    Dernier message: 02/11/2011, 09h34
  3. [MySQL] afficher une seule fois les données redondantes
    Par ginger4957 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 20/05/2009, 16h04
  4. Réponses: 8
    Dernier message: 23/09/2008, 11h20
  5. Réponses: 18
    Dernier message: 10/02/2005, 13h22

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